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

我正在尝试将指向结构中字段的指针的可变参数列表传递给第三方包。该包接受一个可变参数interface{}列表 ( func Persist(...interface) error ),其中每个接口值都是一个指向变量的指针。我创建了一个函数来模拟第三方库的方式并打印出指针的类型和种类(下面称为 mockFunction)。


当我以非可变参数的方式将结构变量的地址传递给它时,它们在使用反射调用的模拟函数中具有它们的原始类型和值。但是,当我使用扩展以可变参数方式传递它们时,它们具有Type: Type: reflect.Value和Kind: struct。第三方包不知道如何以这种形式处理它们。


我想找出一种方法来调用带有接口切片的第三方包{}(例如inv := make([]interface{}, 3),Persist(inv...)如果可能的话,在调用中使用可变参数扩展。


下面是带有 Go Playground 链接的代码:


package main


import (

  "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 ptr

value 1 has Type: *string and Kind ptr

value 2 has Type: *int64 and Kind ptr

当我使用可变参数运行它时,值不同,第三方包不知道如何处理这些类型:


value 0 has Type: reflect.Value and Kind struct

value 1 has Type: reflect.Value and Kind struct

value 2 has Type: reflect.Value and Kind struct

有什么方法可以构造切片定义并调用切片中的内容,以便它可以进行可变参数扩展,并且看起来像以非可变参数方式将指针传递给结构字段?


尚方宝剑之说
浏览 566回答 2
2回答

慕虎7371278

Addr()返回字段指针的反射值。对该值调用Ptr()以获取实际指针作为接口{}。variableParms[i]&nbsp;=&nbsp;s.Field(i).Addr().Ptr()playground
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go