Go学习-Day7
断言
type Node struct {
x int
y int
}
func main() {
var a interface{}
var n Node = Node{1, 2}
a = n
var b Node
b = a.(Node)
fmt.Println(b)
}
- 此处我们有一个结构体n给空接口a赋值(空接口没有方法,相当于方法被n给完全实现,所以是可以赋值给接口的),然后我们想把接口赋值给具体的结构体对象,但是,这里会报错,需要使用类型断言的语法。用.(类型)类声明a的类型。
- 类型断言之后,编译器会判断这个变量是否是指向这个类型,如果是,就转换成这个类型来赋值
文件
打开/关闭文件
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("E:\JetBrains\GoLandSpace\src\go_code\project01\main\test.txt")
if err != nil {
fmt.Println(err)
}
fmt.Printf("%v", f)
err = f.Close()
if err != nil {
fmt.Println(err)
}
}
- 先用os包打开文件,再用方法关闭,上面的绝对路径当中,如果用正斜杠要双写,反斜杠就不用
读取文件
-
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("E:/JetBrains/GoLandSpace/src/go_code/project01/main/test.txt")
if err != nil {
fmt.Println(err)
}
defer f.Close()
reader := bufio.NewReader(f)
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
break
}
fmt.Println(str)
}
fmt.Println("-------------------")
}
- 首先打开文件,然后按行读取,注意读到EOF要结束死循环
- ioutil.ReadFile可以一次性读入到一个字节数组内,不过文件需要比较小的情况下使用
写入文件
import (
"bufio"
"fmt"
"os"
)
func main() {
filePath := "E:/JetBrains/GoLandSpace/src/go_code/project01/main/a.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Printf("%v", err)
return
}
defer file.Close()
str := "ok\n"
writer := bufio.NewWriter(file)
writer.WriteString(str)
writer.Flush()
}
- 写入文件的流程也是非常亲切
- 我们写入写入缓冲区之后,我们必须要flush刷新一下缓冲区,将缓冲区内的字符刷到磁盘上
- 通过不同的标识符,有追加,截断清除的写入操作
- 类似的可以拷贝文件,有io.Copy()函数可以更方便地拷贝文件
命令行参数解析
Args
- os.Args这是go的命令行参数的数组,但是不方便
flag包
flag.StringVar(&xxx, "x", "", "sss")
//第一个变量是传入的值所存的变量的地址,"x"是传入的参数的名字,""是默认值, "sss"是说明
- 设置完这些变量之后使用flag.parse()来解析命令行的参数
JSON
- JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 key-val的形式
- 中括号表示数组,大括号表示对象,一个个的键值对用,号分隔开
- 序列化方法上面写过了,用json.Marshal()
- 反序列化用json.Unmarshal([]byte(str), &xxx)