为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕的地8271018 2021-09-10 21:28:47
我想将 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())

}


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信