io库
跟着源码学 Golang
前言
golang 最好的学习资料,就是 golang 官方库。 注释很全,且对 golang 的各种操作也都很 nice,读完一遍以后,收获很大。
第一次,先看 golang 的 io 库,io 中的方法是最底层的方法,基本上所有的库都会去调用它,读懂这个库的代码是非常值得的,能更加容易去理解他人写的代码。
源码我也是第一次看,其中有很多不懂的地方,也可能会有很多说错的地方,希望能和大家一起探讨,共同学习,进步。
io 库的目录结构
除了io相关的代码外,还包含了 fs 以及 ioutil 两个包,它两个与 io 的关系是什么,还不清楚,为何要将 fs 和 ioutil 要放到 io 包中。
io 库有很多文件,主要看的是 io.go 文件,在看它的过程中,衍生的看一看其他代码。
io 库的目录结构
本文介绍 Go 语言 io 包的常量、接口、函数、结构体,同时也会涉及与之相关的 fs 和 ioutil 包。
io 包
总体结构 & 代码注释
io 文件中总体的结构,有四大部分:常量、interface、function、以及 struct。其中,常量定义了一些 error 和一些与文件读写相关的常量。
interface 定义了一些最基础的接口,比如 Reader、Writer、Closer 和 Seeker;还有一些高级的接口,比如 ReaderFrom、WriterTo、ReaderAt 和 WriterAt。
function 定义了一些操作文件和流的函数,比如 Copy、CopyN、ReadFull 等。
struct 定义了一些用于封装不同类型流的结构体,比如 Pipe、LimitedReader 等。
在代码注释方面,每个函数、接口和结构体都有清晰的注释,对其含义、用法、参数及返回值进行了解释。
相对于其他语言,Go 语言官方提供的代码注释十分详细,这也让使用 Go 语言的开发者更容易理解这些接口的设计思想。
常量
io 包定义了一些常量,其中包括了一些 error 和一些与文件读写相关的常量。
在定义这些常量时,Go 语言采用了驼峰命名法,与其他语言不同的是,并不是像 java 中的全大写字母。
同时,在注释方面,也要对常量的用途进行说明。
// Seek whence values.
const (
SeekStart = 0 // seek relative to the origin of the file
)
// ErrShortWrite means that a write accepted fewer bytes than requested
// but failed to return an explicit error.
var ErrShortWrite = errors.New("short write")
// 看上去 EOF 是一个 error,但它并不是一个异常,当 input(输入端)没有数据可读时(把数据都读完的时候),就会返回一个 EOF 来通知,具体来说,就是当读完 input(输入端)的数据时,会返回 EOF。
var EOF = errors.New("EOF")
思考:所以,有时候 error 返回的不一定都是错误,也可以用 error 来标识结束。