Finalisation dans Go : objets par défaut et pièges
Dans Go, la finalisation est le processus d'exécution d'actions de nettoyage sur les objets avant qu'ils ne soient récupérés. . Par défaut, seuls quelques types d’objets sélectionnés sont finalisés. Cela inclut :
Bien que la finalisation constitue un moyen pratique d'effectuer des actions de nettoyage, elle comporte également des pièges potentiels. Un de ces problèmes survient lorsqu'un os.File est créé à l'aide de os.NewFile(fd int, name string) *File et que le même descripteur de fichier est utilisé par un autre objet os.File. Dans ce scénario, le garbage collection de l'un des objets fichier rendra l'autre inutilisable.
Par exemple, considérons le code suivant :
package main import ( "fmt" "os" "runtime" ) func open() { os.NewFile(1, "stdout") } func main() { open() // Force finalization of unreachable objects _ = make([]byte, 1e7) runtime.GC() _, err := fmt.Println("some text") // Print something via os.Stdout if err != nil { fmt.Fprintln(os.Stderr, "could not print the text") } }
Ce code affichera "Impossible d'imprimer le texte " car le garbage collection d'un objet os.File (créé par os.NewFile) ferme le descripteur de fichier, qui est également utilisé par l'autre objet os.File (os.Stdout). En conséquence, os.Stdout devient inutilisable pour d'autres opérations d'E/S.
Pour éviter cet écueil, il est important de gérer soigneusement les descripteurs de fichiers, en particulier lors de l'utilisation de os.NewFile. Alternativement, on peut désactiver la finalisation des objets os.File en définissant leurs finaliseurs sur nil à l'aide de la fonction runtime.SetFinalizer.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!