Maison  >  Article  >  développement back-end  >  Pourquoi la récupération de pointeurs vers des valeurs interfacées génère-t-elle une exception ?

Pourquoi la récupération de pointeurs vers des valeurs interfacées génère-t-elle une exception ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 19:18:02218parcourir

Why Does Retrieving Pointers to Interfaced Values Raise an 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 :

  • Le premier mot contient les informations de type de la valeur contenue.
  • Le deuxième mot stocke la valeur elle-même (si elle tient dans un mot) ou un pointeur vers son stockage (si la valeur dépasse la taille du mot).

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!

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