断言
- 可以判断变量的类型,并转换成T指定的类型:
value, isTrue = element.(T)
, value 是变量的值,isTrue 是一个bool 类型,element 是interface 变量,T是断言的类型; - Type-switch:Type-switch 是go语言中一种特殊的 switch 语句,它比较的是类型,而不是具体的值。它判断某个接口变量的类型,然后根据具体的类型再做相应处理,语法:
func typeSwitch(s Say){
switch s.(type){
// type 是一个go的关键字,type-switch 的固定写法
case Chinese:
ch := s.(Chinese)
ch.doSmt()
case American:
fmt.Println("什么玩意,不认识...")
}
}
func main() {
c := Chinese{
}
a := American{
}
fmt.Println("\n==>> type-switch:")
typeSwitch(c)
typeSwitch(a)
}
文件操作
- os 包下 File 结构体封装了对文件的操作;
- https://studygolang.com/pkgdoc;
打开、关闭文件
-
打开:
- func Open: 传入一个文件路径(字符串),返回文件的指针和是否打开成功。
func Open(name string) (file *File, err error)
- Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError
- func Open: 传入一个文件路径(字符串),返回文件的指针和是否打开成功。
-
关闭:
-
func (*File) Close : 传入文件的指针;使文件不能用于读写,返回可能出现的错误;
-
func (f *File) Close() error
-
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
读取文件
- 读取文件内容并显示再终端;
- 文件不大: 使用 ioutil 一次将整个文件读取到内存中(iotuil.ReadFile);
func ReadFile(filename string) ([]byte, error)
: ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。- ReadFile 返回的字节数组可以使用 string() 包装,以显示文本内容;
- ReadFile 不需要进行 open/close 操作,文件的打开/关闭被封装在函数内部了;
- 文件较大时:需要使用带缓冲区读取的方式;
- 使用
os.Open, file.Close
配合bufio.NewReader(), reader.ReadString
函数 - bufio 包下:
func (b *Reader) ReadString(delim byte) (line string, err error)
- ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。
- 使用
写入文件
- 使用 OpenFile打开;使用 bufio.NewWriter(*file) + writer.WriteString() + writer.Flush()写入
- func OpenFile: 3个参数:要打开的文件路径;文件打开模式(使用
|
进行组合);权限控制(linux/unix 系统下才生效;windows 下设置无效,为了可移植性最好写上)os.FileMode(0644).String()
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
- OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
- 第二个参数:
Constants
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)