Правильно, поэтому, если вы можете изменить сами типы / структуры, вы можете использовать встраивание, чтобы вы могли переназначить все подмножество полей.Это означает, что вам придется немного изменить способ написания литералов, и, поскольку вы используете json, нужно будет экспортировать встроенный тип.
// Less, the smallest subset of fields that are shared
type Less struct {
A string `json:"a"`
B string `json:"b"`
D string `json:"d"`
}
// More the type that has all the fields in Less + some of its own
type More struct {
Less // embed Less in this type
C string `json:"c"`
E string `json:"e"`
}
Теперь, когда мы получилиэти типы, вот как вы инициализируете поля в литерале:
more := More{
Less: Less{
A: "aaa",
B: "bbb",
D: "ddd",
},
C: "ccc",
E: "eee",
}
// or the dirty way (no field names) - don't do this... it's nasty
yuck := More{
Less{
"a",
"b",
"d",
},
"c",
"e",
}
Теперь, скажем, у нас есть переменная less
примерно так:
less := Less{
A: "aaaaa",
B: "bbbbb",
D: "ddddd",
}
И теперь мыхотим скопировать эти значения в переменную more
, которую мы создали выше:
more.Less = less
Работа выполнена ... Поскольку тип Less
встроен, json marshalling и unmarshalling все равно будут работать вТочно так же