34 votes

Comment initialiser un struct composé en Go ?

Disons que j'ai une structure avec une autre structure incorporée dans celle-ci.

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}

Quand je vais initialiser Child je ne peux pas initialiser le ID directement sur le terrain.

// unknown field 'ID' in struct literal of type Child
child := Child{ ID: id, a: a, b: b }

Je dois plutôt initialiser le champ ID séparément.

child := Child{ a: 23, b: 42 }
child.ID = "foo"

Cela semble violer l'encapsulation. L'utilisateur de Child doit savoir qu'il y a quelque chose de différent dans le champ ID. Si, par la suite, je déplaçais un champ public dans une structure intégrée, cela pourrait rompre l'initialisation.

Je pourrais écrire un NewFoo() pour chaque structure et espérer que tout le monde l'utilise, mais Existe-t-il un moyen d'utiliser le littéral struct en toute sécurité avec des structs intégrés qui ne révèle pas que certains des champs sont intégrés ? Ou est-ce que j'applique le mauvais modèle ici ?

54voto

ThunderCat Points 45890

Utilisez des littéraux composites imbriqués pour initialiser une valeur dans une seule expression :

child := Child{Base: Base{ID: id}, a: a, b: b}

Il n'est pas possible de cacher le fait qu'un champ est promu à partir d'une structure intégrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X