Maison >développement back-end >Golang >Quelle est la différence entre les pointeurs `&` et `*` dans Go, et quand dois-je les utiliser ?

Quelle est la différence entre les pointeurs `&` et `*` dans Go, et quand dois-je les utiliser ?

DDD
DDDoriginal
2024-11-29 04:13:10715parcourir

What's the Difference Between `&` and `*` Pointers in Go, and When Should I Use Each?

Explorer l'utilisation et la distinction des pointeurs & et *

Lorsque vous travaillez avec des fonctions Go, il est assez fréquent de rencontrer des erreurs liées au passage de variables en tant qu'arguments commun. L'utilisation de pointeurs, désignés par & ou *, peut souvent résoudre ces problèmes. Cependant, comprendre leurs différences et leur utilisation appropriée est crucial.

Définition et utilisation

L'opérateur & renvoie l'adresse mémoire d'une variable, tandis que * est utilisé pour déréférencer une variable. aiguille. Dans votre exemple, vous avez défini u comme type User mais pas comme pointeur vers un utilisateur. Par conséquent, vous deviez utiliser &u car la fonction Decode du package json attend une adresse ou un pointeur.

Si u a été initialement créé en tant que pointeur en utilisant u := new(User) ou var u *User, le & dans l'appel à Decode deviendrait inutile.

Analogie et exemple

Pensez aux pointeurs comme variables qui stockent les adresses. De la même manière que nous trouvons notre maison grâce à son adresse, les pointeurs aident à récupérer les données stockées à des emplacements de mémoire spécifiques.

Supposons que vous ayez une variable x représentant une adresse en mémoire. Lorsque vous tapez &x, vous obtenez effectivement l'adresse de x lui-même. Cependant, si vous tapez *x, vous redirigez vers l'emplacement mémoire stocké dans x et y récupérez les données réelles.

Par exemple, si vous avez une variable y qui contient la valeur 10 et que vous créez un pointeur vers lui, pointerToY, pointerToY stockera l'adresse de y.

Maintenant, &y vous donnera l'adresse de y, tandis que &pointerToY fournira l'adresse du pointeur lui-même.

S'amuser avec les pointeurs

Voici un programme pour illustrer davantage les concepts :

package main

import "fmt"

func main() {
    var y int
    var pointerToY *int
    var pointerToPointerToInt **int

    y = 10
    pointerToY = &y
    pointerToPointerToInt = &pointerToY

    fmt.Println("pointerToY: ", pointerToY)
    fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt)

    fmt.Println("*pointerToY: ", *pointerToY) // dereferencing to get y's value
    fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt)

    fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt) // dereferencing twice to get y's value
}

Ce programme démontre les différents résultats lors de l'utilisation pointeurs et déréférencement. Il illustre comment vous pouvez accéder aux données en redirigeant via un pointeur et comment le double déréférencement renvoie finalement la valeur des données d'origine.

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