Structs intégrés dans Go : pointeur contre objet
Lorsque vous traitez avec 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 en tant que 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.
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
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.
type APtr struct {
*B
}
var aPtr APtr
aPtr.Print() // panics
Copie d'objet
Lorsqu'un objet AObj est créé, il obtient une copie de l'objet B intégré. Les modifications apportées à la copie n'affectent pas l'objet original.
aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0
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 l'objet d'origine et le nouvel objet.
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1
Il est important de prendre en compte le cas d'utilisation et les exigences spécifiques pour déterminer s'il faut intégrer 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3