Maison  >  Article  >  développement back-end  >  Quand intégrer un pointeur vers une structure par rapport à la structure elle-même dans Go ?

Quand intégrer un pointeur vers une structure par rapport à la structure elle-même dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 08:27:30751parcourir

When to Embed a Pointer to a Struct vs. the Struct Itself in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn