io包一共分为两块:主目录和ioutil目录。总得来说,还是比较干净的。
在整个io包中,有以下几个文件:

io.go
multi.go
pipe.go
ioutil

ioutil.go
tempfile.go

比起原来的reflect包来说,内容还是多了不少。

先看一下io.go的代码,内容不多,一共才530行。multi.go更少,一共100行。pipe.go则是200行。
这样的代码倒是非常方便阅读。

至于ioutil包里的两个代码,也分别在200行左右。

在io.go的代码段中,有一段都是用来定义接口的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1type Reader interface {}  
2type Writer interface {}
3type Closer interface {}
4type Seeker interface {}
5type ReadWriter interface {}
6type ReadCloser interface {}
7type WriteCloser interface {}
8type ReadWriteCloser interface {}
9type ReadSeeker interface {}
10type WriteSeeker interface {}
11type ReadWriteSeeker interface {}
12type ReaderFrom interface {}
13type WriterTo interface {}
14type ReaderAt interface {}
15type WriterAt interface {}
16type ByteReader interface {}
17type ByteScanner interface {}
18type ByteWriter interface {}
19type RuneReader interface {}
20type RuneScanner interface {}
21type stringWriter interface {} //私有

一共21个……这么多。目前来说,我并不知道他们的实际用处。

接下来,又定义了几组对外的公有函数:

1
2
3
4
5
6
7
8
9
1func WriteString(w Writer, s string) (n int, err error) {}  
2func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) {}
3func ReadFull(r Reader, buf []byte) (n int, err error) {}
4func CopyN(dst Writer, src Reader, n int64) (written int64, err error) {}
5func Copy(dst Writer, src Reader) (written int64, err error) {}
6func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {}
7func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {} //私有
8func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} }
9func TeeReader(r Reader, w Writer) Reader {}

最后,定义了几组对象:

1
2
3
4
5
6
type LimitedReader struct {
R Reader // underlying reader
N int64 // max bytes remaining
}
func (l *LimitedReader) Read(p []byte) (n int, err error) {}
func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader {}
1
2
3
4
5
6
7
8
9
10
type SectionReader struct {
r ReaderAt
base int64
off int64
limit int64
}
func (s *SectionReader) Read(p []byte) (n int, err error) {}
func (s *SectionReader) Seek(offset int64, whence int) (int64, error) {}
func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error) {}
func (s *SectionReader) Size() int64 { return s.limit - s.base }
1
2
3
4
5
type teeReader struct { //私有
r Reader
w Writer
}
func (t *teeReader) Read(p []byte) (n int, err error) {

以上就是io.go的全貌了。