Maison > développement back-end > Golang > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-28 19:18:02
original
220 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!