我正在尝试将指向结构中字段的指针的可变参数列表传递给第三方包。该包接受一个可变参数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
有什么方法可以构造切片定义并调用切片中的内容,以便它可以进行可变参数扩展,并且看起来像以非可变参数方式将指针传递给结构字段?
慕虎7371278
相关分类