Le déréférencement d'une structure crée-t-il une nouvelle copie dans Go ?
Dans Go, lorsqu'une variable d'un type struct est passée par référence à l'aide l'opérateur astérisque (*), une idée fausse peut survenir selon laquelle la variable déréférencée représente la même adresse que l'original struct.
Cependant, comme démontré dans l'extrait de code donné :
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) // Address of p.color return &p } func main() { p := study() // p is a pointer to a struct fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color obj := *p // obj is a copy of the struct pointed to by p fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color fmt.Printf("obj = %+v\n", obj) p.color = "purple" // Changes color of the struct pointed by p fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p // Another copy is made fmt.Printf("obj2 = %+v\n", obj2) }
Lorsque nous exécutons ce code, la sortie montre que la variable déréférencée obj a une adresse différente de celle de la struct p d'origine . En effet :
Le déréférencement crée une nouvelle copie :
La ligne obj := *p crée une nouvelle variable obj du même type que p (moi), et l'initialise avec une copie de la valeur pointée par p. Cela signifie que toute modification apportée à obj n'affectera pas la structure d'origine.
Attribuer efficacement une nouvelle valeur de structure à une autre :
Similaire à var obj me = *p , l'opération de déréférencement dans obj := *p attribue une nouvelle valeur de structure à la variable obj. Cela crée une nouvelle copie avec une mémoire séparée.
Utilisez l'opérateur astérisque avec prudence :
Bien que l'opérateur astérisque fournisse la sémantique du pointeur, il est important de comprendre ses effets sur les variables. . Lorsqu'une valeur est attribuée avec l'opérateur * (déréférencement), elle crée une nouvelle copie, pas une nouvelle référence à la variable 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!