golang – 对嵌入式结构的反思

前端之家收集整理的这篇文章主要介绍了golang – 对嵌入式结构的反思前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给出一个像这样的结构:
  1. type B struct {
  2. X string
  3. Y string
  4. }
  5.  
  6. type D struct {
  7. B
  8. Z string
  9. }

我想反思D并得到X,Y,Z字段.

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

但是你可以看到,我只看到嵌入的结构B使用反射,而不是它的字段.

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

有没有办法让B在D上反映完全透明?

为什么要这样?

成像一个通用的结构体(在这里的例子中为B),这是通过使用嵌入在多个其他结构体中使用的.使用反射,尝试将D复制到另一个包中的另一个类似的结构体.复制的目的结构将具有所有属性平面布置(不嵌入).因此,从源到目的地(嵌入vs无嵌入)是不匹配的,但是所有的属性都是相同的.我不想为每个结构创建自定义解决方案.

您期望的“透明度”只是语法糖,与数据表示无关.如果你想有一个使你的数据结构变得平坦的功能,你必须自己写.

例如(On play):

  1. func DeepFields(iface interface{}) []reflect.Value {
  2. fields := make([]reflect.Value,0)
  3. ifv := reflect.ValueOf(iface)
  4. ift := reflect.TypeOf(iface)
  5.  
  6. for i := 0; i < ift.NumField(); i++ {
  7. v := ifv.Field(i)
  8.  
  9. switch v.Kind() {
  10. case reflect.Struct:
  11. fields = append(fields,DeepFields(v.Interface())...)
  12. default:
  13. fields = append(fields,v)
  14. }
  15. }
  16.  
  17. return fields
  18. }

猜你在找的Go相关文章