Go 1.7 beta 1 于今天早上发布,这里是Go 1.7 的发布说明草稿。一个新功能KeepAlive被添加到包runtime中。的文档runtime.KeepAlive给出了一个例子:
type File struct { d int }
d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0)
// ... do something if err != nil ...
p := &FILE{d}
runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) })
var buf [10]byte
n, err := syscall.Read(p.d, buf[:])
// Ensure p is not finalized until Read returns.
runtime.KeepAlive(p)
// No more uses of p after this point.
的文档runtime.SetFinalizer还对以下内容进行了解释runtime.KeepAlive:
例如,如果 p 指向一个包含文件描述符 d 的结构,并且 p 具有关闭该文件描述符的终结器,并且如果函数中最后一次使用 p 是对 syscall.Write(pd, buf, size ),那么一旦程序进入 syscall.Write,p 就可能无法访问。终结器可能在那个时候运行,关闭 pd,导致 syscall.Write 失败,因为它正在写入一个关闭的文件描述符(或者更糟糕的是,写入由不同的 goroutine 打开的完全不同的文件描述符)。为避免此问题,请在调用 syscall.Write 之后调用 runtime.KeepAlive(p)。
令我困惑的是,变量p还没有离开它的生命范围,为什么它会无法访问?这是否意味着只要在以下代码中没有使用变量,无论它是否在其生命范围内,它都将无法访问?
回首忆惘然
相关分类