Finalisation dans Go : objets par défaut et pièges
Le runtime Go finalise automatiquement des objets spécifiques lorsqu'ils sont récupérés. Ce mécanisme intégré peut conduire à des pièges potentiels s'il n'est pas bien compris.
Objets finalisés par défaut :
Pièges de la finalisation par défaut :
Lorsque os.File est finalisé, il invoque le système d'exploitation pour fermer son descripteur de fichier. Cependant, si ce descripteur de fichier est partagé avec un autre objet os.File créé à l'aide de os.NewFile(fd int, name string) *File, la finalisation de l'un ou l'autre objet corrompt l'autre.
Par exemple, considérez 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 échouerait avec l'erreur suivante, en raison du descripteur de fichier partagé :
could not print the text
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!