Maison >développement back-end >Golang >Pourquoi la récupération de pointeurs vers des valeurs interfacées génère-t-elle une exception ?
Récupération de pointeurs vers des valeurs interfacées
Tenter d'obtenir un pointeur vers une valeur stockée dans une interface peut déclencher une exception, comme illustré par le code ci-dessous :
<code class="go">import "container/list" type retry struct{} el := list.New().PushBack(retry{}) p := &el.Value.(retry)</code>
Cela entraîne une erreur indiquant que l'adresse de el.Value.(retry) ne peut pas être prise. Ce comportement ne se limite pas aux structures ; elle s'applique à tout type stocké dans une interface.
Comprendre la représentation de la valeur d'interface
Pour comprendre cette restriction, considérons la représentation interne d'une valeur d'interface. Il se compose de deux mots :
Essentiellement, la valeur contenue appartient à la variable d'interface. De plus, le stockage de cette valeur peut être réutilisé lorsqu'une nouvelle valeur est attribuée à l'interface.
Conséquences de la récupération de pointeur autorisée
Comprenant ces principes, tenez compte des éléments suivants code :
<code class="go">var v interface{} v = int(42) p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42 v = &SomeStruct{...}</code>
Ici, le stockage utilisé pour l'entier a été réutilisé pour contenir un pointeur vers une structure. Par conséquent, le déréférencement de *p produit désormais une représentation entière du pointeur vers SomeStruct. Ce comportement peut potentiellement nuire au système de types.
Solutions alternatives
Pour éviter ce problème, envisagez de stocker des pointeurs vers des structures au lieu des structures elles-mêmes dans la liste. Alternativement, vous pouvez transmettre 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!