杂记2(eof错误)

C 的 read,pread 这两个接口对应的是 Golang 的 Read 和 ReadAt 这两个接口,C 的 read,pread 除了传入参数有区别,其他语义是完全一致的。golang有区别

Golang 里面 Read 接口对于读的结果有这么几种情况:

  • 读成功了,数据完全填充 buffer ,读到了用户预期的数据大小,这个时候 n == len(p),err == nil,p 里都是用户有用的数据;
  • 读失败了,err != nil ,这个时候 err 会标示出对应的错误;
  • 读到 EOF 了,err == EOF,n 表示读到的有用数据大小,p 部分被填充;
  • 第四种最坑(最细节),这个也是 Read 特意说明的(我截屏标红的), golang 允许当数据还没全部准备好的时候,返回部分数据,这个时候 err == nil; 也就是说,Read 接口允许:没有读满预期的 buffer,也不是 EOF 的情况,err == nil,这种情况是 Golang Read 接口语义的一部分;

而对于 ReadAt 接口,Golang 的 interface 也特意说明了,这个接口比 Read 更严格,不允许第四种情况的发生。也就是说,ReadAt 读数据的结果,只有三种:

  • 那么就是读成功,读满 buffer,这个时候 n==len(p),err==nil;
  • 要么就是读到 EOF,这个时候没有读满 buffer,只读到了部分有效数据,n
  • 要么就是读失败,这个时候 err 表示错误码;

ReadAt 绝对不允许出现,没有读满 buffer,又非 EOF,又没有 err 的情况发生,这个是接口语义明确规定的,这是一个非常细节的区别。

参考文章:golang eof 错误_Golang 最细节篇之 — Reader 和 ReaderAt 的区别_北溟先生的博客-CSDN博客

posted @ 2023-01-14 16:36  balabalahhh  阅读(175)  评论(0编辑  收藏  举报