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

在 Go 结构体中获取reflect.Ptr 类型到字段

在 Go 结构体中获取reflect.Ptr 类型到字段

Go
尚方宝剑之说 2021-08-23 15:37:34
我正在尝试将指向结构中字段的指针的可变参数列表传递给第三方包。该包接受一个可变参数interface{}列表 ( func Persist(...interface) error ),其中每个接口值都是一个指向变量的指针。我创建了一个函数来模拟第三方库的方式并打印出指针的类型和种类(下面称为 mockFunction)。当我以非可变参数的方式将结构变量的地址传递给它时,它们在使用反射调用的模拟函数中具有它们的原始类型和值。但是,当我使用扩展以可变参数方式传递它们时,它们具有Type: Type: reflect.Value和Kind: struct。第三方包不知道如何以这种形式处理它们。我想找出一种方法来调用带有接口切片的第三方包{}(例如inv := make([]interface{}, 3),Persist(inv...)如果可能的话,在调用中使用可变参数扩展。下面是带有 Go Playground 链接的代码:package mainimport (  "fmt"  "reflect")type Investment struct {  Price  float64  Symbol string  Rating int64}func main() {  inv := Investment{Price: 534.432, Symbol: "GBG", Rating: 4}  s := reflect.ValueOf(&inv).Elem()  variableParms := make([]interface{}, s.NumField())  for i := 0; i < s.NumField(); i++ {    variableParms[i] = s.Field(i).Addr()  }  // non-variadic call  mockFunction(&inv.Price, &inv.Symbol, &inv.Rating)  //variadic call  mockFunction(variableParms...)}func mockFunction(values ...interface{}) {  for i, value := range values {    rv := reflect.ValueOf(value)    fmt.Printf("value %d has Type: %s and Kind %s\n", i, rv.Type(), rv.Kind())  }}当我使用非可变参数运行它时,对 mockFunction 的调用返回本机类型和种类,第三方包可以很好地处理它们:value 0 has Type: *float64 and Kind ptrvalue 1 has Type: *string and Kind ptrvalue 2 has Type: *int64 and Kind ptr当我使用可变参数运行它时,值不同,第三方包不知道如何处理这些类型:value 0 has Type: reflect.Value and Kind structvalue 1 has Type: reflect.Value and Kind structvalue 2 has Type: reflect.Value and Kind struct有什么方法可以构造切片定义并调用切片中的内容,以便它可以进行可变参数扩展,并且看起来像以非可变参数方式将指针传递给结构字段?
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

Addr()返回字段指针的反射。对该值调用Ptr()以获取实际指针作为接口{}。

variableParms[i] = s.Field(i).Addr().Ptr()

playground


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 565 浏览
慕课专栏
更多

添加回答

举报

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