Prendre l'adresse d'une valeur à l'intérieur d'une interface
Dans le contexte du langage de programmation Go, une interface agit comme un contrat, définissant un ensemble des méthodes qu’un type doit implémenter. Lorsqu'une valeur est affectée à une interface, elle est enveloppée dans une valeur d'interface. Cependant, la valeur de l'interface elle-même ne stocke pas la valeur réelle mais contient une référence à celle-ci.
Par conséquent, tenter de prendre l'adresse d'une valeur à l'intérieur d'une interface à l'aide de l'opérateur & entraînera une erreur, comme démontré. dans l'extrait de code suivant :
<code class="go">import "container/list" type retry struct{} var el = list.Element{Value: retry{}} p := &el.Value.(retry) // Compilation error: cannot take the address of el.Value.(retry)</code>
Cette erreur provient du fait que la valeur à l'intérieur de l'interface appartient à la valeur de l'interface elle-même, et son stockage peut être réutilisé lorsqu'une nouvelle valeur est attribuée à l'interface . Modifier la valeur à l'adresse obtenue affecterait directement la valeur de l'interface, ce qui n'est pas souhaitable et pourrait conduire à un comportement inattendu.
Pour résoudre cette situation, il existe des approches alternatives disponibles :
Stocker des pointeurs au lieu de valeurs :
Au lieu de stocker les valeurs de structure directement dans l'interface, on peut stocker des pointeurs vers ces structures. Cela garantit que le pointeur reste valide même si la valeur de l'interface change.
Utiliser les références d'éléments :
Une autre option consiste à transmettre les valeurs *list.Element comme références aux structures contenues. Cela fournit effectivement un accès indirect aux valeurs de la structure sans violer la sécurité des types de Go.
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!