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
    指针的
    接口{}
  • v.Addr().Interface().(*int)
    a
    *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
字段的示例:。它起作用了。