杂记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博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话