
大纲

Golang 关于 Read 的两个接口定义
C 语言 libc 库关于 read 的接口
Golang 里 Read 和 ReadAt 的区别
那么,会出什么样的坑呢?
总结

概述

分享一个细节语义问题引发的思考。关于 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 读数据的时候只需要给一个 buff