golang – 对嵌入式结构的反思
发布时间:2020-12-16 19:20:37 所属栏目:大数据 来源:网络整理
导读:给出一个像这样的结构: type B struct { X string Y string}type D struct { B Z string} 我想反思D并得到X,Y,Z字段. 直觉地,在尝试解决方案之前,我假设我将能够遍历结构D并使用反射(X,Z)获取所有字段,并且不必处理B. 但是你可以看到,我只看到嵌入的结构B使
给出一个像这样的结构:
type B struct { X string Y string } type D struct { B Z string } 我想反思D并得到X,Y,Z字段. 直觉地,在尝试解决方案之前,我假设我将能够遍历结构D并使用反射(X,Z)获取所有字段,并且不必处理B. 但是你可以看到,我只看到嵌入的结构B使用反射,而不是它的字段. http://play.golang.org/p/qZQD5GdTA8 有没有办法让B在D上反映完全透明? 为什么要这样? 成像一个通用的结构体(在这里的例子中为B),这是通过使用嵌入在多个其他结构体中使用的.使用反射,尝试将D复制到另一个包中的另一个类似的结构体.复制的目的结构将具有所有属性平面布置(不嵌入).因此,从源到目的地(嵌入vs无嵌入)是不匹配的,但是所有的属性都是相同的.我不想为每个结构创建自定义解决方案.
您期望的“透明度”只是语法糖,与数据表示无关.如果你想有一个使你的数据结构变得平坦的功能,你必须自己写.
例如(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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |