web-dev-qa-db-fra.com

Type de structure intégrée à Golang

J'ai ces types:

type Value interface{}

type NamedValue struct {
    Name  string
    Value Value
}

type ErrorValue struct {
    NamedValue
    Error error
}

Je peux utiliser v := NamedValue{Name: "fine", Value: 33}, mais je suis pas capable d'utiliser e := ErrorValue{Name: "alpha", Value: 123, Error: err}

Il semble que l'intégration de la syntaxe était correcte, mais son utilisation ne fonctionne pas?

10
Ayman

Les types incorporés sont des champs (non nommés), désignés par le nom de type non qualifié.

Spec: Types de structures:

Un champ déclaré avec un type mais pas de nom de champ explicite est un champ {champ anonyme), également appelé champ incorporé ou une incorporation du type dans la structure. Un type incorporé doit être spécifié en tant que nom de type T ou en tant que pointeur sur un nom de type non-interface *T, et T lui-même ne peut pas être un type de pointeur. Le nom de type non qualifié agit comme le nom de champ.

Alors essayez:

e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}

Fonctionne également si vous omettez les noms de champs dans le littéral composite:

e := ErrorValue{NamedValue{"fine", 33}, err}

Essayez les exemples sur le Go Playground .

19
icza

En plus de la merveilleuse réponse de icza.

vous pouvez simplement faire ceci:

v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}

et cela fonctionne très bien. Commander l'exemple Ici

0