Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-01 02:51:27
original
705 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

À 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal