Golang - отражение встроенных структур
Для такой структуры:
type B struct {
X string
Y string
}
type D struct {
B
Z string
}
Я хочу задуматься о D и перейти к полям X, Y, Z.
Интуитивно, прежде чем пытаться решить проблему, я предполагал, что смогу пересечь структуру D и получить все поля с использованием отражения (X, Y, Z) и не придется иметь дело с B.
Но, как вы можете видеть, я вижу только встроенную структуру B, используя отражение, а не его поля.
http://play.golang.org/p/qZQD5GdTA8
Есть ли способ сделать B полностью прозрачным при отражении на D?
Зачем мне это нужно?
Отображение общей структуры (B в примере здесь), которая используется в нескольких других структурах с помощью вложения. Используя отражение, попытка состоит в том, чтобы скопировать D в другую подобную структуру в другом пакете. Целевая структура для копирования будет иметь все атрибуты, которые будут плотно выложены (там нет вложения). Таким образом, существует несовпадение от источника до места назначения (вложение против без встраивания), но все атрибуты, которые были выложены, одинаковы. Я не хочу создавать собственные решения для каждой структуры.
Ответы
Ответ 1
"Прозрачность", которую вы ожидаете, представляет собой просто синтаксический сахар и не имеет ничего общего с представлением данных. Если вы хотите иметь функцию, которая сглаживает вашу структуру данных, вам придется написать ее самостоятельно.
Например (В игре):
func DeepFields(iface interface{}) []reflect.Value {
fields := make([]reflect.Value, 0)
ifv := reflect.ValueOf(iface)
ift := reflect.TypeOf(iface)
for i := 0; i < ift.NumField(); i++ {
v := ifv.Field(i)
switch v.Kind() {
case reflect.Struct:
fields = append(fields, DeepFields(v.Interface())...)
default:
fields = append(fields, v)
}
}
return fields
}