安全地关闭golang中的文件描述符

时间:2020-11-09 01:32:55

标签: go

另一个问题How to read/write from/to file using Go?安全地关闭了注释中的文件描述符。

请注意,这些示例并未检查来自以下位置的错误返回 fo.Close()。从Linux手册页关闭(2):不检查返回值 close()的值是一个常见的但很严重的编程 错误。先前的write(2)错误很有可能 首先在最终close()中报告操作。不检查 关闭文件时返回值可能会导致数据无提示丢失。 使用NFS和磁盘配额尤其可以观察到这一点。 –尼克 Craig-Wood 2013年1月25日,7:12

更新帖子的解决方案引起了恐慌:

// close fo on exit and check for its returned error
defer func() {
    if err := fo.Close(); err != nil {
        panic(err)
    }
}()

我想将此错误作为值而不是惊慌。

1 个答案:

答案 0 :(得分:0)

如果我们担心写close还不够完成,那么更新错误仍然不正确。

如果不希望这样做,正确的解决方案是fsync文件:

defer(fd.Close())
// Do stuff
return fd.Sync()

通过延迟或在整个函数中进行维护,更容易读取然后返回未修改的错误。

这会带来性能上的损失,但是会同时捕获写入缓冲区和物理写入磁盘时出现的关闭错误。

相关问题