Tenir compte de l'extrait de code suivant:Collision entre garbage collector et fonctions différées?
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := file.Close(); err != nil {
fmt.Printf("%v", err)
}
}
Ce morceau de code est légitime, et fonctionnera OK. Les dossiers seront fermés au retour de a()
Cependant, ce qui suit ne fonctionnera pas correctement:
func a(fd int) {
file := os.NewFile(uintptr(fd), "")
defer func() {
if err := syscall.Close(int(file.Fd()); err != nil {
fmt.Printf("%v", err)
}
}
L'erreur qui sera reçu, à l'occasion, sera bad file descriptor
, en raison du fait de NewFile setting a finalizer qui, lors de la collecte des ordures , va fermer le fichier lui-même. Ce qui n'est pas clair pour moi, c'est que la fonction différée a toujours une référence au fichier, donc théoriquement, il ne devrait pas encore être collecté. Alors, pourquoi golang runtime se comporte-t-il de cette façon?
connexes/possible duplicatr de [Dans Go, quand une variable devient inaccessible?] (Http://stackoverflow.com/questions/37588639/in-go-when-will-a-variable- devenir inatteignable/37591282 # 37591282) – icza