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 }
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 }
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 }
Maintenant, examinons le résultat :
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
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
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
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!