大纲
分享一个细节语义问题引发的思考。关于 Golang Read,ReadAt 这两个接口,不知道大家有没有仔细品过这两个接口的区别。golang 里面有两个关于 Read 的 interface ,就是 Reader 和 ReaderAt ,这两个接口的定义在标准库 io 的 io.go 文件中,如下:
Golang 关于 Read 的两个接口定义
Reader interface 定义
type Reader interface {
Read(p []byte) (n int, err error)
}
ReaderAt interface 定义
type ReaderAt interface {
ReadAt(p []byte, off int64) (n int, err error)
}
从 interface 接口来看,我们看到的区别是:
- Reader 传入参数只有一个 p( 用来装读到的数据的 buffer ),返回参数是 n(读了多少数据),err(返回的错误码);
- ReaderAt 传入参数是两个,一个 ( 装读到的数据 buffer ),off(读取的偏移位置),返回值 n(标示读到了多少数据),err(错误码);
也就是说,Read 读数据的时候只需要给一个 buffer 就行了,偏移在内部维护,ReadAt 可以让你从指定的位置读数据,偏移自维护。这个是两个接口的最明显的区别,现在我的问题是:真的只有这样吗?
C 语言 libc 库关于 read 的接口
思考这个问题之前,我们看下 c 语言相关的接口,关于 libc 库,我们有 3 个读的接口,分别是 read,readv,pread。这三个接口的传入参数略有不同,定义如下(可以用 man 2 read
自行查看手册):
#include <sys/types.h>