You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中将可关闭资源赋值给空标识符(blank identifier)是否会引发资源泄漏?

问题结论

你给出的示例代码会产生文件描述符泄漏,打开的*os.File资源绝不会被自动关闭。

具体原因

  • 你提到的“无访问入口的变量会被编译器优化”仅针对Go runtime层面的变量存储:编译器确实会消除栈上对这个*os.File指针的存储,不会占用应用层的内存。但os.Open是系统调用,内核层面分配文件描述符的副作用是编译器无法消除的,只要你调用了os.Open且没有主动调用返回实例的Close()方法,这个文件描述符就会一直被当前进程占用,直到进程退出才会被操作系统回收。
  • 你将返回的*os.File直接赋值给空标识符_,相当于直接丢弃了该资源的唯一引用入口,你根本没有机会再调用它的Close()方法,自然就会造成永久的资源泄漏。进程能持有的文件描述符数量有上限,泄漏积累到一定程度后,所有打开文件、建立网络连接等需要申请fd的操作都会直接失败。

正确写法

必须接住返回的资源实例,用defer注册关闭逻辑:

func check(path string) bool {
    f, err := os.Open(path)
    if err != nil {
        return true
    }
    defer f.Close()
    return false
}

内容的提问来源于stack exchange,提问作者hant0508

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:03