第八章 标准库
- 标准库是一组核心包,用于扩展和增强语言的能力
- 每次语言更新都会带有标准库
- 标准库会严格遵守哦向后兼容的承诺
- 标准库是go语言开发,构建,发布过程的一部分
- 标准库由go的构建者们维护和评审
- go语言发布新版本时,标准库都会被测试,并评估性能
- 开发中尽量使用标准库
文档与源代码
- 作为go发布包的一部分,标准库的源代码是经过预编译的,称为归档文件
- 这些文件是go静态库文件,由go的构建工具创建,并在编译和链接最终程序时被使用
日志
log包简介
- log包日志项包含前缀、日期时间戳、源文件、行数、日志消息等组成
|
|
- init函数作为初始化的一部分,会在main函数执行前执行
- SetPrefix()方法进行设置前缀,一般全部大写
- SetFlags设定标志来控制可以写到每个日志项的输出信息,如下
- 这样可以用一个字节来存储日志的标志位,
log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile
和传入00001111
是等价的 - 日志中以ln结尾的函数会换行,以f结尾的函数可以自定义格式化输出
- log包是多线程安全的,多个goroutine同时来调用一个日志记录器的函数,不会存在写冲突
|
|
- Fatal系列函数来先写消息,然后调用os.Exit方法退出
|
|
- Panic函数写日志消息,触发panic,打印堆栈然后退出
|
|
- Print函数是写日志消息的标准方法
|
|
定制的日志记录器
- 创建一个定制的日志记录器,需要创建一个Logger类型值
|
|
- log包的New()函数完成Logger类型的初始化,设定输出位置,日志前缀,及日志输出内容
|
|
- ioutil.Discard实现了io.Writer接口,但是并不会发生实际的写入,使用Discard可以禁用这个类型的日志
- os.Stdin、os.Stdout、os.Stderr分别指向标准输入,标准输出,标准错误
- io.MultiWriter()方法可以向多个实现了io.Writer接口的位置写入日志
log包中的其余函数
|
|
- logger结构体
|
|
- logger核心方法 Output
|
|
编码/解码
- xml/json包可以完成json和xml的编码解码
解码JSON
- 使用json包的NewDecode函数和Decode方法来完成json解码
|
|
- json中NewDecoder方法返回Decoder对象
- Decoder结构体从输入流中读取数据并解码成json
- Decode方法完成JSON的解析映射
|
|
- json文档以string的形式存在,此时使用json.Unmarshal方法完成反序列化处理
|
|
编码JSON
- MarshalIndent方法可以完成map和结构体到json的映射
输入和输出
Writer和Reader接口
- io包的核心就是Writer和Reader接口
- Writer接口
- Writer接口接收字节切片,返回两个值,写入的字节数和错误输出
- Writer接口从p里向底层的数据流写入len(p)字节的数据
- Writer无论如何也不能改p中的数据
- Reader接口
- Reader接口接收字节切片,返回两个值,读取的字节数和错误输出
- Read最多读入len(p)个字节,保存到p
- 可以使用所有的p的空间来存储临时数据
- 当字节长度不足len(p),Read会立刻返回可用的数据,而不是等待更多的数据
- 当成功读取了部分字节后,发生错误或者读取完成,Read方法会返回读入的字节数
- 即使有错误发生,当读取的字节数>0时,需要先处理读取的数据,再处理错误
- 读取的实现,不鼓励返回0个字节并且返回nil值的错误1234567type Writer interface {Write(p []byte) (n int, err error)}type Reader interface {Read(p []byte) (n int, err error)}
- Writer接口
例子
|
|
- Buffe的Write方法
|
|
curl
- 一个简单的curl,第一个参数指定curl的网站,,第二个参数指定将curl获取的response的body写入的文件名
- defer 打开关闭的资源
|
|
小结
- 标准库由特殊的保证,并且被社区广泛应用
- 使用标准库会让你的代码更易于管理
- 接口允许你的代码组合已有的功能
- 阅读标准库的代码是熟悉go语言习惯的好方法