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
Susan Sarandonoriginal
2024-12-02 18:59:09246parcourir

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
}

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)

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

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

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
}

* (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

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!

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