Reflection 设置具有接口字段类型的结构字段
有没有办法使用reflect设置接口字段?当我试图设置它时,它惊慌失措地说该值不可寻址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"
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()
)获得该值。