首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >golang -对嵌入式结构的反思

golang -对嵌入式结构的反思
EN

Stack Overflow用户
提问于 2014-06-21 02:26:58
回答 1查看 13.8K关注 0票数 34

给定一个类似这样的结构:

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复制到不同包中的另一个类似结构中。要复制的目标结构的所有属性都是平面布局的(那里没有嵌入)。因此,从源到目标之间存在不匹配(嵌入与不嵌入),但所有平面布局的属性都是相同的。我不想为每个结构创建自定义解决方案。

EN

回答 1

Stack Overflow用户

发布于 2014-06-21 02:57:03

你所期望的“透明性”只是语法上的糖,与数据表示无关。如果你想要一个扁平化数据结构的函数,你必须自己编写它。

例如(On play):

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
}
票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24333494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档