【发布时间】:2017-05-03 15:57:19
【问题描述】:
Go 的 io.Reader 文档指出,Read() 可能会同时返回非零值 n 和 io.EOF。不幸的是,File 的 Read() 方法并没有做到这一点。
当到达 EOF 并且仍然可以读取一些字节时,文件的 Read 方法返回非零 n 和 nil 错误。只有当我们已经在文件末尾尝试读取时,我们才会返回零 n 和 io.EOF 作为错误。
如果不尝试从文件中读取数据,我找不到一个简单的方法来测试是否达到 EOF。如果我们使用 0 字节的缓冲区执行 Read(),尽管我们在文件末尾,但我们会返回零 n 和 nil 错误。
为避免最后一次读取,我找到的唯一解决方案是自己跟踪文件中要读取的剩余字节数。有没有更简单的解决方案?
【问题讨论】:
-
不是 AFAIK。你也许可以使用 seek 或其他东西来获取当前位置,但由于它需要更多的系统调用,所以它会更慢。
-
为什么不创建一个总是读取一些字节并返回EOF的类型?
-
@JimB 这是一个了不起的技巧。我将采用该解决方案。但我不会提前读取,而是跟踪剩余要读取的字节,以便及时返回 io.EOF。我最喜欢它的原因是我不需要在程序中的任何地方修改代码。我只需要为 File 提供一个包装器。如果你用这两个选项写了一个很好的答案,我会把它授予你。