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
Libérer: 2024-11-29 04:13:10
original
639 Les gens l'ont consulté

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
}
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal