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!