Maison  >  Article  >  développement back-end  >  Structures intégrées dans Go : quand intégrer par valeur ou par pointeur ?

Structures intégrées dans Go : quand intégrer par valeur ou par pointeur ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 19:34:30991parcourir

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Structs intégrés dans Go : pointeur contre objet

Lorsque vous traitez des récepteurs de pointeurs et construisez des types de pointeurs, comprendre la différence entre l'intégration d'une structure car un objet (B) par rapport à un pointeur (*B) devient crucial. Dans ce contexte, les valeurs zéro de ces deux types de structures intégrées diffèrent considérablement.

Incorporation directe (objet)

Si une structure B avec des récepteurs de pointeurs est intégrée directement comme un objet dans une structure A, sa valeur zéro inclut un objet incorporé de type B, qui a lui-même une valeur zéro. Les développeurs peuvent accéder en toute sécurité à cet objet intégré et à ses méthodes.

<code class="go">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</code>

Incorporation de pointeur

En revanche, l'intégration d'un pointeur vers B (*B) crée un scénario différent . La valeur zéro de cette structure intégrée a une valeur de pointeur nulle, la rendant directement inutilisable.

<code class="go">type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics</code>

Copie d'objet

Lorsqu'un objet AObj est créé, il obtient une copie de l'objet B incorporé. Les modifications apportées à la copie n'affectent pas l'objet d'origine.

<code class="go">aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0</code>

Copie du pointeur

Avec APtr, la création d'un nouvel objet copie le pointeur (*B) mais pas l'objet concret sous-jacent pointé. Par conséquent, les modifications apportées au nouvel objet affectent à la fois les objets d'origine et les nouveaux.

<code class="go">aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1</code>

Il est important de prendre en compte le cas d'utilisation et les exigences spécifiques lors de la détermination de l'intégration d'une structure en tant qu'objet ou pointeur. Cette décision peut avoir un impact sur l'initialisation nulle, le comportement de copie et la propriété des objets, entre autres facteurs.

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