← 返回文章

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 来标识结束。