Maison > développement back-end > Golang > Go Structs : le déréférencement crée-t-il une copie ou une référence ?

Go Structs : le déréférencement crée-t-il une copie ou une référence ?

DDD
Libérer: 2024-11-30 06:48:15
original
556 Les gens l'ont consulté

Go Structs: Does Dereferencing Create a Copy or a Reference?

Déréférencement de structures dans Go : dévoilement de la copie par rapport au référencement

Dans Go, le déréférencement d'une structure à l'aide de l'opérateur * peut sembler renvoyer un nouveau copie de la structure au lieu de l'adresse originale. Cela peut conduire à des malentendus.

Considérez le code suivant :

type me struct {
    color string
    total int
}
Copier après la connexion

Dans ce code, nous définissons une structure nommée me.

Au sein de la fonction d'étude, nous créons a me struct p et initialise son champ de couleur. Nous renvoyons ensuite l'adresse de p en utilisant &p.

func study() *me {
    p := me{}
    p.color = "tomato"
    return &p
}
Copier après la connexion

Dans la fonction principale, nous obtenons l'adresse de p.color et la stockons dans &p.color. Nous déréférençons ensuite p et stockons le résultat dans obj.

func main() {
    p := study()
    obj := *p
}
Copier après la connexion

Maintenant, examinons le résultat :

&p.color = 0x10434120
&obj.color = 0x10434140   //different than &p.color!
Copier après la connexion

Lorsque nous comparons &p.color et &obj.color, nous constatons que ils ont des adresses différentes. Cela pourrait suggérer que lorsque nous déréférencessons p, nous créons une nouvelle copie de la structure.

Cependant, ce n'est pas le cas. Lorsque nous utilisons *p, nous copions la valeur de la structure pointée par p. C'est équivalent à utiliser :

var obj me = *p
Copier après la connexion

obj est une nouvelle variable de type me, initialisée à la valeur de *p. Cela fait que obj a une adresse mémoire distincte.

Il est important de noter que obj est de type me, tandis que p est de type *me. Ce sont des valeurs distinctes. Changer les champs obj n'affectera pas les champs dans p.

Si nous voulons modifier la structure d'origine, nous pouvons utiliser :

obj := p
// equivalent to: var obj *me = p
Copier après la connexion

Dans ce cas, obj pointe vers le même objet comme p. Ils ont des adresses différentes mais détiennent la même adresse dans l'objet moi réel.

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