Déréférencement de structure : comprendre la copie de valeur par rapport à l'affectation de référence
Lorsque vous travaillez avec des structures dans Go, l'opérateur astérisque (*) peut être utilisé pour déréférencer un pointeur de structure, soulevant des questions quant à savoir s'il renvoie la même valeur de structure ou une nouvelle copie. Précisons cela à travers un exemple :
Considérons le code suivant :
type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" return &p }
Dans ce cas, la fonction study() renvoie un pointeur vers une structure me. Lorsque nous appelons Study() dans la fonction principale et que nous l'attribuons à p, nous stockons essentiellement une référence à la structure me d'origine. Cependant, lorsque nous déréférencessons p en utilisant obj := *p, nous copions la valeur de la structure pointée par p. Cela équivaut à :
var obj me = *p
En conséquence, obj devient une nouvelle variable de type me, initialisée avec les mêmes données que la struct pointée par p. Cela signifie que obj et p ont des adresses mémoire distinctes, même s'ils contiennent les mêmes données.
Il est important de noter que si nous apportons des modifications à la structure obj, elles n'affecteront pas les données pointées par p. , sauf si la structure me contient des types de référence (tels que des tranches, des cartes ou des canaux). Dans de tels cas, les modifications apportées à ces champs seront reflétées à la fois dans obj et dans la structure pointée par p.
Cependant, si nous voulons attribuer une référence à la même structure que p, au lieu de copier sa valeur, nous pouvons utiliser une affectation directe :
obj := p
Dans ce cas, obj contiendra une référence directe à la même structure que p, et toutes les modifications apportées à obj seront également visibles via p.
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!