Dans Go, une variable devient inaccessible lorsque le runtime Go détermine que le code ne fera plus référence à la variable. Cela peut se produire même si la variable est toujours dans sa portée.
Exemple :
Considérez l'extrait de code suivant :
type File struct { d int } func main() { d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) if err != nil { return } p := &File{d} runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) }) var buf [10]byte n, err := syscall.Read(p.d, buf[:]) runtime.KeepAlive(p) }
Dans cet exemple, la variable p n'est plus utilisée après l'appel syscall.Read. Cependant, il reste dans la portée de la fonction principale.
Le runtime peut marquer p comme inaccessible car son finaliseur ne sera pas exécuté avant le retour de syscall.Read. L'appel système est responsable du référencement et de l'utilisation du descripteur de fichier p.d.
Fonction KeepAlive :
Pour éviter le marquage précoce de p comme inaccessible, la fonction runtime.KeepAlive est utilisé. Cette fonction informe le runtime que p est toujours utilisé, même s'il n'est pas référencé dans le code. Cela garantit que le finaliseur ne sera pas exécuté avant le retour de syscall.Read.
Points clés :
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3