小编典典

使用接口的字段类型设置结构字段

go

有什么方法可以使用反射设置界面字段?当我尝试设置它时,它惊慌地说该值不可寻址。

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)

阅读 610

收藏
2020-07-02

共1个答案

小编典典

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

您也Set不能取消导出字段。您需要大写您的B类型的字段名称。遍历字段时,用于Value.CanSet()测试它们是否可设置。CanSet()如果该值不可寻址或该值仍在接口中,则也会返回false。

您的代码的有效示例:http :
//play.golang.org/p/Mf1HENRSny

2020-07-02