Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 设置具有接口字段类型的结构字段_Reflection_Go - Fatal编程技术网

Reflection 设置具有接口字段类型的结构字段

Reflection 设置具有接口字段类型的结构字段,reflection,go,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"

有没有办法使用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)
键入一个接口{…}
func CreateA(名称字符串)A{…}
B型结构{
场A
应该
镜像
}
//初始化的正常方式
变量b=b{
字段:CreateA(“字段”),
should:CreateA(“should”),
镜像:创建一个(“镜像”),
}
func MirrorField(b*b){
t:=反射类型(b)
v:=反射值(b)
对于i:=0;i
接口没有字段,它们只定义包含的值的方法集。当对接口进行反思时,可以使用提取值

您也不能
设置
未报告的字段。您需要将
B
类型中的字段名大写。迭代字段时,用于测试字段是否可设置<如果值不可寻址,或者值仍在接口中,则code>CanSet()
也将返回false

代码的工作示例:

您会思考什么?上面的代码编译得很好。你有什么问题?一个人通常用a来解决这个问题。你想用反射做什么?所以没有办法将一个字段的接口设置为类型?当然可以。字段的类型并不重要,只要它是有效的赋值。你最初的问题没有意义,可能是你困惑的根源,因为没有“接口字段”这样的东西。接口只定义一个方法集。您需要接口中包含的值,可以通过
Elem()
(或
reflect.Indirect()
)获得该值。