使用接口的字段类型设置struct字段

时间:2015-02-18 19:53:23

标签: reflection go

有没有办法使用reflect设置接口字段?当我试图设置它时,它惊慌地说这个值是不可寻址的。

type A interface{...}

func CreateA(name string) A {...}

type B struct {
   field A
   should A
   mirror A
}

// normal way of initializing
var b = B{
  field: CreateA("field"),
  should: CreateA("should"),
  mirror: CreateA("mirror"),
}

func MirrorField(b *B) {
   t := reflect.TypeOf(b)
   v := reflect.ValueOf(b)
   for i := 0; i < t.NumField(); i++ {
      setTo = CreateA(t.Field(1).Name)
      fieldVal := v.Field(i)
      fieldVal.Set(reflect.ValueOf(setTo))
   }
}

// what i want is something like
var b = &B{}
MirrorField(b)

1 个答案:

答案 0 :(得分:1)

接口没有字段,它们只定义它们包含的值的方法集。在界面上反映时,您可以使用Value.Elem()提取值。

您也无法Set未导出的字段。您需要将B类型中的字段名称大写。迭代字段时,使用Value.CanSet()来测试它们是否可设置。 CanSet()也将返回false,表示值不可寻址,或者值仍在界面中。

代码的工作示例: http://play.golang.org/p/Mf1HENRSny