Maison >développement back-end >Golang >Pourquoi ne puis-je pas obtenir l'adresse d'une valeur stockée dans une interface Go ?

Pourquoi ne puis-je pas obtenir l'adresse d'une valeur stockée dans une interface Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-02 09:16:02966parcourir

 Why Can't I Get the Address of a Value Stored in a Go Interface?

Adressage d'une valeur dans une interface

Tenter d'obtenir l'adresse d'une valeur stockée dans une interface entraîne souvent des erreurs, telles que "ne peut pas prenez l'adresse de el.Value.(retry)". Pour comprendre cette limitation, nous devons examiner la nature des variables d'interface.

Une variable d'interface se compose de deux parties : l'une décrivant le type de la valeur contenue et l'autre stockant directement la valeur ou tenant un pointeur vers sa valeur. stockage. La valeur stockée dans une interface appartient à la variable d'interface elle-même. De plus, le stockage de cette valeur peut être réutilisé lorsque l'interface se voit attribuer une nouvelle valeur.

À titre d'exemple :

<code class="go">var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}</code>

Dans ce scénario, le stockage utilisé pour contenir l'entier est réutilisé pour contenir un pointeur, rendant la valeur à *p une représentation entière invalide du nouveau pointeur. Ce comportement pourrait facilement compromettre le système de types et pour cette raison, Go ne fournit pas de moyen direct d'obtenir les adresses des valeurs d'interface (en dehors de l'utilisation du package non sécurisé).

Si vous avez besoin de pointeurs vers des structures stockées dans une liste, envisagez de stocker des pointeurs vers les structures elles-mêmes plutôt que vers les structures directement. Alternativement, vous pouvez utiliser les valeurs *list.Element comme références aux structures contenues.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn