は、次のコードスニペットを考えてみましょう:ガベージコレクタと遅延機能の衝突?
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := file.Close(); err != nil {
fmt.Printf("%v", err)
}
}
コードのこの作品は合法で、[OK]を動作します。 、
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := syscall.Close(int(file.Fd()); err != nil {
fmt.Printf("%v", err)
}
}
時折、受信されるエラー原因NewFile setting a finalizer ガベージコレクション中にいる、という事実に、bad file descriptor
次のようになります。ファイルはしかし、以下は正しく動作しませんa()
からの復帰時に閉じられますファイル自体を閉じます。
私には分かりませんが、遅延関数には依然としてファイルへの参照があるため、理論的にはまだガベージコレクションされるべきではありません。 なぜgolangランタイムはそのように動作しますか?
関連の/可能duplicatr [ゴーでは、とき変数が到達不能になるのだろうか?](http://stackoverflow.com/questions/37588639/in-go-when-will-a-variable-到達不能/ 37591282#37591282) – icza