Для этого нет встроенной поддержки.Если вам это действительно нужно, вы можете написать общую функцию, которая использует отражение для копирования полей.
Или вы можете изменить дизайн.Если Big
- это Small
плюс некоторые другие дополнительные поля, почему бы не использовать повторно Small
в Big
?
type Small struct {
A int
B string
}
type Big struct {
S Small
C float
D byte
}
Тогда, если у вас есть структура Big
, у вас также естьSmall
: Big.S
.Если у вас есть Small
, и вам нужен Big
: Big{S: small}
.
Если вы беспокоитесь о том, чтобы потерять удобство более коротких имен полей или других маршаллированных результатов, тогда используйте встраивание вместо именованного поля:
type Big struct {
Small // Embedding
C float
D byte
}
Тогда они также действительны: Big.A
, Big.B
.Но если вам нужно значение Small
, вы можете обратиться к встроенному полю, используя в качестве имени поля неквалифицированное имя типа, например, Big.Small
(см. Тип встроенной структуры Golang ).Аналогично, для создания Big
из Small
: Big{Small: small}
.