Golang 最细节篇之 — Reader 和 ReaderAt 的区别

大纲


分享一个细节语义问题引发的思考。关于 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>
#include
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值