Déréférencement de structures dans Go : création de nouvelles copies
Lorsque vous travaillez avec des structures dans Go, il est important de comprendre le comportement du déréférencement. Le déréférencement d’un objet renvoie essentiellement une copie de la valeur vers laquelle il pointe. Cela peut être contre-intuitif pour certains programmeurs provenant d'autres langages, où le déréférencement renvoie généralement l'objet lui-même.
Considérez l'extrait de code Go suivant :
package main import ( "fmt" ) type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" fmt.Printf("%p\n", &p.color) return &p } func main() { p := study() fmt.Printf("&p.color = %p\n", &p.color) obj := *p fmt.Printf("&obj.color = %p\n", &obj.color) fmt.Printf("obj = %+v\n", obj) p.color = "purple" fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p fmt.Printf("obj2 = %+v\n", obj2) }
Dans cet exemple, l'étude() La fonction crée une nouvelle structure me et renvoie un pointeur vers celle-ci. On assigne ensuite ce pointeur à une variable p. Lorsque nous déréférençons p et l'attribuons à obj, nous créons une nouvelle copie de la structure. Cette nouvelle copie a une adresse mémoire différente de la structure d'origine pointée par p.
Cela signifie que la modification des champs d'obj n'affectera pas les champs de la structure d'origine, et vice versa. Pour créer une référence à la structure d'origine, nous aurions besoin d'attribuer le pointeur de p vers obj :
obj := p
Dans ce cas, obj et p pointeraient vers la même structure et toute modification apportée à l'une d'entre elles le ferait se refléter dans l'autre.
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!