Betrachten Sie den folgenden Code-Schnipsel:Kollision zwischen Garbage Collector und verzögerten Funktionen?
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := file.Close(); err != nil {
fmt.Printf("%v", err)
}
}
Dieses Stück Code ist echt, und OK arbeiten. Dateien werden von a()
jedoch bei der Rückkehr geschlossen werden, werden die folgenden wird nicht korrekt funktionieren:
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := syscall.Close(int(file.Fd()); err != nil {
fmt.Printf("%v", err)
}
}
Der Fehler, der gelegentlich empfangen werden, werden bad file descriptor
sein, aufgrund der Tatsache der NewFile setting a finalizer , die während der Garbage Collection , wird die Datei selbst schließen.
Was mir unklar ist, ist, dass die Deferred-Funktion immer noch einen Verweis auf die Datei hat, so dass theoretisch noch kein Müll gesammelt werden sollte. Also warum verhält sich Golal Runtime so?
Verwandte/möglich duplicatr von [In Go, wird, wenn eine Variable wird nicht erreichbar?] (Http://stackoverflow.com/questions/37588639/in-go-when-will-a-variable- werden-unerreichbar/37591282 # 37591282) – icza