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!