考慮下面的代碼片段:垃圾回收器和延遲函數之間的衝突?
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := file.Close(); err != nil {
fmt.Printf("%v", err)
}
}
這段代碼是合法的,並會工作確定。文件將在從a()
但是返回被關閉,以下將無法正常工作:
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := syscall.Close(int(file.Fd()); err != nil {
fmt.Printf("%v", err)
}
}
將要收到的錯誤,偶爾會bad file descriptor
,由於NewFile setting a finalizer 的這一事實,垃圾回收過程中,將關閉文件本身。
對我而言還不清楚的是,延遲函數仍然有一個對文件的引用,所以理論上它不應該被垃圾收集。 那麼,爲什麼golang運行時的行爲就是這樣呢?
相關的/可能的duplicatr [在Go中,當將一個變量變得不可達?](http://stackoverflow.com/questions/37588639/in-go-when-will-a-variable-成爲不可達/ 37591282#37591282) – icza