在 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