"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Quand une variable Go devient-elle inaccessible et comment « runtime.KeepAlive » peut-il l'empêcher ?

Quand une variable Go devient-elle inaccessible et comment « runtime.KeepAlive » peut-il l'empêcher ?

Publié le 2024-11-23
Parcourir:289

When Does a Go Variable Become Unreachable, and How Can `runtime.KeepAlive` Prevent It?

Quand une variable devient-elle inaccessible dans Go ?

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 :

  • Une variable devient inaccessible en fonction du flux de code, et non de la portée. .
  • runtime.KeepAlive peut être utilisé pour empêcher explicitement qu'une variable devienne inaccessible.
  • Utilisation d'autres constructions comme _ = p garder les variables en vie peut ne pas être fiable.
Dernier tutoriel Plus>

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