Go - все о композиции над наследованием. К сожалению, вы используете анонимные структуры, но, учитывая, что вы явно пытаетесь JSon маршала их, вы лучше определений их типов:
type name struct {
Name string `json:"name"`
}
type desc struct {
Description string `json:"description"`
}
Вы можете инициализировать их точно так же, как вы» повторно в настоящее время делает, но вместо struct{<fields>}{init}
, вы просто написать
a := name{"foo"}
b := desc{"Description"}
вы можете комбинировать их в любом случае вы хотите написать:
c := struct {
name
description
}{a, b}
Один выверт (что может сработать у Сначала вы должны привыкнуть к тому, когда вы создаете такие типы, как это вы инициализируете членов. Допустим, вы решили создать тип, который сочетает в себе два других структур:
type foo struct {
name
description
}
Вы не можете инициализировать его, как это:
o := foo{"Name value", "description value"}
Go будет сетовать вы используете строку типа как тип name
. Вы должны написать что-то вроде этого:
o := foo{
name{"Name value"},
description{Description: "Description val"},//optional with field names
}
рядный композит построен с использованием существующих объектов (ср c := struct{}{a, b}
) делает это уже.
В зависимости от того, что вы пытаетесь сделать, это иногда проще написать что-то вроде этого:
func (s *MyCompositeType) CopyName(n name) {
s.Name = n.Name
//copy other fields
}
Это делает жизнь проще, когда вы вложенности составных типов несколько уровней вложенности.
Что бы неправильно с 'fmt.Sprintf ("{\" Имя \ ":% ц, \" Описание \ ":% д}", a.Name, b.Description) '? Некоторые вещи ** ** требуют некоторого кодирования ... – Volker