在 golang 中安全关闭文件描述符

Bri*_*ian 3 go

另一个问题如何使用 Go 读取/写入文件?在评论中安全关闭文件描述符。

\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

更新帖子的解决方案使用了恐慌:

\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}()\n
Run Code Online (Sandbox Code Playgroud)\n

我想将此错误作为一个值传递,而不是惊慌失措。

\n

Bri*_*ian 5

如果我们害怕写入没有完成close还不够,那么更新错误仍然是不正确的。

如果您不想遇到此问题,正确的解决方案是fsync文件:

defer(fd.Close())
// Do stuff
return fd.Sync()
Run Code Online (Sandbox Code Playgroud)

通过 defer 或在整个函数中维护来返回非零修改错误更容易阅读。

这将影响性能,但会捕获写入缓冲区和物理写入磁盘的关闭错误。