Maison > Article > développement back-end > Quand intégrer un pointeur vers une structure par rapport à la structure elle-même dans Go ?
Intégrer un pointeur vers une structure ou incorporer la structure elle-même
Dans le scénario donné, où une structure de type A est utilisée comme pointeur et contient uniquement des récepteurs de pointeurs, il existe une distinction entre l'intégration d'un type de structure B en tant que B par rapport à *B.
Comportement de valeur zéro
La différence la plus apparente réside dans les valeurs nulles des structures résultantes. Lors de l'intégration de B tel quel, la valeur zéro de type A inclura un objet incorporé de type B, qui contient également sa valeur zéro. Cela permet une utilisation transparente du champ intégré sans initialisation préalable :
type B struct { X int } func (b *B) Print() { fmt.Printf("%d\n", b.X) } type AObj struct { B } var aObj AObj aObj.Print() // prints 0
D'un autre côté, l'intégration de *B entraîne une valeur nulle avec un pointeur nul, empêchant l'accès direct au champ :
type APtr struct { *B } var aPtr APtr aPtr.Print() // panics
Copie de champ
Lors de la création de nouveaux objets de type A, le comportement de la copie de champ s'aligne sur l'intuition. L'intégration de B crée directement une copie de l'objet incorporé dans le nouvel objet, en préservant l'indépendance :
aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to a separate instance of B
À l'inverse, l'intégration de *B crée une copie du pointeur plutôt que de l'objet concret sous-jacent. Cela signifie que les deux objets partagent la même instance B, ce qui a un impact sur les modifications de champ :
aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, as both objects point to the same B
En substance, l'intégration de B crée des instances distinctes de la structure contenue, tandis que l'intégration de *B partage une seule instance concrète dans plusieurs structures intégrées. . Cette distinction affecte à la fois la sémantique de la valeur zéro et le comportement de la copie de champ.
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!