Maison  >  Article  >  développement back-end  >  Intégrer une Struct ou un pointeur vers une Struct : quand et pourquoi ?

Intégrer une Struct ou un pointeur vers une Struct : quand et pourquoi ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 02:51:27625parcourir

Embed a Struct or a Pointer to a Struct: When and Why?

Intégrer une structure ou un pointeur vers une structure en tant que pointeur : différences clés

Quand une structure de type A agit comme un pointeur avec uniquement des récepteurs et des constructeurs de pointeurs renvoyer A, intégrer un autre type de structure B présente deux options : intégrer B directement ou intégrer B.

Différences de valeur nulle :

Les valeurs zéro de A avec B intégré par rapport à *B intégré diffèrent. Lorsque B est intégré directement, la valeur zéro de A contient une valeur zéro intégrée de B, permettant une utilisation sûre sans initialisation :

<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>

Cependant, l'intégration d'une valeur de pointeur nulle dans la valeur zéro d'APtr rend l'utilisation directe impossible :

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

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

Copie d'objets :

Les objets sont copiés comme prévu. La création d'un nouvel AObj copie le B intégré :

<code class="go">aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0, due to the copy</code>

À l'inverse, la création d'un nouvel APtr copie le *B, en préservant l'objet concret partagé :

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

Exemple :

https://play.golang.org/p/XmOgegwVFeE fournit un exemple exécutable démontrant ces différences.

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