golang - 对嵌入式结构的反思

sat*_*sat 23 go

给出这样的结构:

type B struct {
    X string
    Y string
}

type D struct {
    B
    Z string
}
Run Code Online (Sandbox Code Playgroud)

我想反思D并进入X,Y,Z领域.

直观地说,在尝试解决方案之前,我假设我能够遍历结构D并使用反射(X,Y,Z)获取所有字段,并且不必处理B.

但正如您所看到的,我只看到嵌入式结构B使用反射而不是其字段.

http://play.golang.org/p/qZQD5GdTA8

有什么方法可以让我在反映D时完全透明?

我为什么要这个?

对通用结构进行成像(此处示例中为B),通过使用嵌入在多个其他结构中使用.使用反射,尝试将D复制到另一个包中的另一个类似结构中.复制的目标结构将平面布局所有属性(不嵌入).因此,从源到目标(嵌入与不嵌入)存在不匹配,但所有平面布局的属性都是相同的.我不想为每个结构创建自定义解决方案.

nem*_*emo 23

你期望的"透明度"只是语法糖,与数据表示无关.如果你想要一个能够平衡数据结构的函数,你必须自己编写它.

例如(正在播放):

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
}
Run Code Online (Sandbox Code Playgroud)

  • 也许您应该检查字段是否嵌入之前,如果要模拟OP期望的'透明度',请将其展平?即``如果v.Kind()== reflect.Struct && v.Anonymous {`` (7认同)