Maison > développement back-end > Golang > Go Pointeurs : quelle est la différence entre `&` (Adresse de) et `*` (Déréférence) ?

Go Pointeurs : quelle est la différence entre `&` (Adresse de) et `*` (Déréférence) ?

Susan Sarandon
Libérer: 2024-12-02 18:59:09
original
317 Les gens l'ont consulté

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& et * Pointeurs

Dans Go, passer des variables comme arguments de fonction peut parfois déclencher des erreurs du compilateur, qui peuvent être résolues à l'aide de pointeurs. Cependant, les distinctions entre les pointeurs & et * prêtent souvent à confusion. Cet article vise à clarifier les différences et les scénarios d'utilisation pour les deux types de pointeurs.

Résoudre l'erreur

Dans votre exemple, l'erreur est probablement due à la non-concordance entre le type d'argument attendu et le type d'argument réel. variable passée. La fonction Decode nécessite une adresse ou un pointeur vers une structure User, mais vous transmettez la valeur directement. Pour résoudre ce problème, vous pouvez utiliser l'opérateur & pour obtenir l'adresse de la variable utilisateur :

if err := decoder.Decode(&u); err != nil {
    http.Error(rw, "could not decode request", http.StatusBadRequest)
    return
}
Copier après la connexion

Comprendre les pointeurs

Les pointeurs sont des variables qui contiennent les adresses d'autres variables. L'opérateur & renvoie l'adresse d'une variable, tandis que l'opérateur * nous permet d'accéder à la valeur à cette adresse.

Dans l'exemple ci-dessus, &u donne l'adresse de la structure User, qui est ensuite transmise à la Fonction de décodage qui attend un pointeur.

Cependant, si vous aviez créé l'instance utilisateur en utilisant :

u := new(User)
Copier après la connexion

Alors vous seriez déjà un pointeur, et l'opérateur & ne serait pas nécessaire. Vous pouvez également créer explicitement un pointeur en utilisant :

var u *User
Copier après la connexion

Différence entre & et *

La principale différence entre & et * est que * représente une redirection vers la valeur stockée à l'adresse, tandis que & renvoie l'adresse lui-même.

Exemple :

var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY
Copier après la connexion

Maintenant :

  • y contient la valeur 10.
  • *pointerToY redirige vers y et imprime sa valeur 10.
  • &y renvoie l'adresse de y.
  • &pointerToY renvoie l'adresse de pointerToY.
  • &pointerToPointerToInt renvoie l'adresse de pointerToPointerToInt.
  • **pointerToPointerToInt imprime la valeur 10 puisqu'il redirige deux fois pour accéder à y.

Utilisation Scénarios

& (Adresse de l'opérateur) :

  • Pour passer l'adresse d'une variable à une fonction.
  • Pour obtenir le adresse avant de l'attribuer à un pointeur.
  • Pour comparer deux pointeurs.

Exemple :

func swap(x, y *int) {
    *x, *y = *y, *x
}
Copier après la connexion

* (Opérateur de déréférencement) :

  • À accéder à la valeur stockée à une adresse.
  • Pour attribuer une valeur à un pointeur.
  • Pour comparer deux pointeurs.

Exemple :

var p *int

*p = 10
Copier après la connexion

Conclusion :

Comprendre les pointeurs & et est crucial dans Go pour une gestion efficace des variables et la résolution des erreurs du compilateur. La distinction clé réside dans le comportement de « redirection » de , tandis que & renvoie l'adresse réelle de la variable. En examinant attentivement les scénarios d'utilisation prévus, vous pouvez exploiter efficacement les pointeurs de votre code Go pour des performances et une exactitude optimales.

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