我正在嘗試將指向結構中字段的指針的可變參數列表傳遞給第三方包。該包接受一個可變參數interface{}列表 ( func Persist(...interface) error ),其中每個接口值都是一個指向變量的指針。我創(chuàng)建了一個函數來模擬第三方庫的方式并打印出指針的類型和種類(下面稱為 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有什么方法可以構造切片定義并調用切片中的內容,以便它可以進行可變參數擴展,并且看起來像以非可變參數方式將指針傳遞給結構字段?
添加回答
舉報
0/150
提交
取消