如何从接口获取结构体成员的指针{}

我想将 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()方法实际上做了什么了解不深..


慕的地8271018
浏览 211回答 1
1回答

拉莫斯之舞

这是函数 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())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go