Intégrer des structures : quand préférer les pointeurs
Lors de l'intégration d'une structure dans une autre, il existe deux options : utiliser un pointeur ou une valeur incorporée . Pour guider cette décision, il est important de comprendre les spécifications et de considérer les avantages de chaque approche.
Pointeurs par rapport aux valeurs intégrées
Selon la spécification Go, un Un champ anonyme (également appelé champ incorporé) peut être déclaré comme nom de type ou comme pointeur vers un nom de type non-interface. Cela signifie que vous avez le choix d'utiliser le type log.Logger ou un pointeur *log.Logger pour le champ Logger dans l'exemple suivant :
type Job struct {
Command string
*log.Logger
}
Avantages des pointeurs
L'article "Embedding in Go" d'Eric Urban met en évidence les avantages de l'intégration d'un pointeur, appelé "embed by-pointer ". Ceux-ci incluent :
Exemple d'intégration de pointeur
type Bitmap struct{
data [4][5]bool
}
type Renderer struct{
*Bitmap //Embed by pointer
on uint8
off uint8
}
Dans cet exemple, le type Renderer embarque un Bitmap par pointeur. Cela signifie que plusieurs instances de Renderer peuvent partager une seule instance de Bitmap et personnaliser leur comportement indépendamment.
Limites techniques
Il est important de noter que vous ne pouvez pas utiliser de pointeurs vers des pointeurs. ou des pointeurs vers des interfaces sous forme de champs anonymes. Cette restriction vient du fait que ces types n’ont pas de méthodes, ce qui est un aspect clé de l’intégration. Les méthodes sont promues du type incorporé au type incorporé, vous permettant d'y accéder directement.
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