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!