Pointers 如何获取struct'的指针;来自接口{}的s成员
我想将结构的指针传递给期望接口{}的函数。然后(通过反射)获取指向结构成员的指针,然后使用该指针修改它。我读过很多问答,也尝试过很多变化,但我仍然可以让它工作 我们考虑下面的例子:Pointers 如何获取struct'的指针;来自接口{}的s成员,pointers,reflection,go,Pointers,Reflection,Go,我想将结构的指针传递给期望接口{}的函数。然后(通过反射)获取指向结构成员的指针,然后使用该指针修改它。我读过很多问答,也尝试过很多变化,但我仍然可以让它工作 我们考虑下面的例子: type Robot struct { Id int } f := func(i interface {}) { v := reflect.ValueOf(i).Elem().FieldByName("Id") ptr := v.Addr().Pointer() *ptr = 100
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
我认为问题在于对reflect package的Addr()和Pointer()方法的理解不足。这里是函数f的一个工作版本:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
ptr := v.Addr().Interface().(*int)
*ptr = 100
}
整数指针的转换如下所示:
是表示v
字段的int
reflect.Value
是一个v.Addr()
表示指向relefect.Value
字段的指针int
是包含v.Addr().Interface()
指针的int
接口{}
av.Addr().Interface().(*int)
*int
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
v.SetInt(100)
}
如果将值传递给期望的接口{}(如db/sql方法),则可以删除类型断言:
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
scan(v.Addr().Interface())
}
非常感谢。我的大脑超负荷了,我想明天再检查一下!我想我需要一段时间和实践来真正理解这里发生了什么。尤其是在这里<代码>v.Addr().Interface().(*int)。你能分享一下我在哪里能掌握这方面的知识吗?@TimurFayzrakhmanov我更新了答案,并对表达式
v.Addr().Interface()(*int)
.v.Addr().Interface()进行了分解。非常感谢!如果字段具有某种接口类型,则不起作用。@wvxvw以下是用接口类型替换int
字段的示例:。它起作用了。