我想将 struct 的指针传递给期望 interface{} 的函数。然后(通过反射)获取指向结构成员的指针,然后使用此指针修改它。我已经阅读了很多问答并尝试了很多变化,但我仍然可以让它工作。让我们考虑下面的例子: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()方法实际上做了什么了解不深..
1 回答
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
这是函数 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)
类型断言的interface{}
以一个*int
您可以直接设置字段而无需获取指针:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
v.SetInt(100)
}
如果您将值传递给期望 interface{} 的东西(如 db/sql Scan方法),那么您可以删除类型断言:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
scan(v.Addr().Interface())
}
- 1 回答
- 0 关注
- 206 浏览
添加回答
举报
0/150
提交
取消