我想将struct的指针传递给期望接口{}的函数。然后得到(通过反射)指向struct的成员的指针,然后使用这个指针修改它。我已经阅读了很多Q& A并尝试了很多变化,但我仍然可以使用它。
让我们考虑以下示例:
type Robot struct {
Id int
}
f := func(i interface {}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
ptr := v.Addr().Pointer()
*ptr = 100
//^ it needs to me for functions expecting the pointer: Scan(&pointerToValue)
}
robot := &Robot{}
f(robot)
println(robot.Id) //I want to get here 100
我认为这个问题很难理解实际做什么 Addr()和 Pointer()反映包的方法..
答案 0 :(得分:20)
这是函数f的工作版本:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
ptr := v.Addr().Interface().(*int)
*ptr = 100
}
转换为整数指针如下:
v
是代表reflect.Value
字段的int
。v.Addr()
是relfect.Value
,表示指向int
字段的指针。v.Addr().Interface()
是包含interface{}
指针的int
。v.Addr().Interface().(*int)
type asserts interface{}
到*int
您可以直接设置字段而无需获取指针:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
v.SetInt(100)
}
如果要将值传递给期望接口{}的东西(如db / sql Scan方法),那么可以删除类型断言:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
scan(v.Addr().Interface())
}