在 Go 中,当 Go 运行时确定代码不会再次引用该变量时,该变量将变得不可访问。即使变量仍在其范围内,也会发生这种情况。
示例:
考虑以下代码片段:
type File struct { d int } func main() { d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) if err != nil { return } p := &File{d} runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) }) var buf [10]byte n, err := syscall.Read(p.d, buf[:]) runtime.KeepAlive(p) }
在此示例中,在 syscall.Read 调用之后不再使用变量 p。然而,它仍然在主函数的范围内。
运行时可以将 p 标记为不可访问,因为它的终结器在 syscall.Read 返回之前不会执行。系统调用负责引用和使用p.d文件描述符。
KeepAlive函数:
为了防止早期将p标记为不可访问,runtime.KeepAlive函数是用过的。此函数通知运行时 p 仍在使用中,即使代码中未引用它。这确保了在 syscall.Read 返回之前不会执行终结器。
要点:
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3