另一个问题如何使用 Go 读取/写入文件?在评论中安全关闭文件描述符。
\n\n\n请注意,这些示例并未检查从 fo.Close() 返回的错误。从 Linux 手册页 close(2) 来看:不检查 close() 的返回值是一个常见但严重的编程错误。很可能在最后的 close() 中首先报告先前 write(2)\n 操作的错误。关闭文件时不检查\n返回值可能会导致数据无提示丢失。\n在使用 NFS 和磁盘配额时尤其可以观察到这一点。\xe2\x80\x93 尼克\n克雷格-伍德 2013 年 1 月 25 日 7:12
\n
更新帖子的解决方案使用了恐慌:
\n// close fo on exit and check for its returned error\ndefer func() {\n if err := fo.Close(); err != nil {\n panic(err)\n }\n}()\nRun Code Online (Sandbox Code Playgroud)\n我想将此错误作为一个值传递,而不是惊慌失措。
\n如果我们害怕写入没有完成close还不够,那么更新错误仍然是不正确的。
如果您不想遇到此问题,正确的解决方案是fsync文件:
defer(fd.Close())
// Do stuff
return fd.Sync()
Run Code Online (Sandbox Code Playgroud)
通过 defer 或在整个函数中维护来返回非零修改错误更容易阅读。
这将影响性能,但会捕获写入缓冲区和物理写入磁盘的关闭错误。
| 归档时间: |
|
| 查看次数: |
8382 次 |
| 最近记录: |