我正在嘗試將指向結(jié)構(gòu)中字段的指針的可變參數(shù)列表傳遞給第三方包。該包接受一個(gè)可變參數(shù)interface{}列表 ( func Persist(...interface) error ),其中每個(gè)接口值都是一個(gè)指向變量的指針。我創(chuàng)建了一個(gè)函數(shù)來(lái)模擬第三方庫(kù)的方式并打印出指針的類(lèi)型和種類(lèi)(下面稱(chēng)為 mockFunction)。當(dāng)我以非可變參數(shù)的方式將結(jié)構(gòu)變量的地址傳遞給它時(shí),它們?cè)谑褂梅瓷湔{(diào)用的模擬函數(shù)中具有它們的原始類(lèi)型和值。但是,當(dāng)我使用擴(kuò)展以可變參數(shù)方式傳遞它們時(shí),它們具有Type: Type: reflect.Value和Kind: struct。第三方包不知道如何以這種形式處理它們。我想找出一種方法來(lái)調(diào)用帶有接口切片的第三方包{}(例如inv := make([]interface{}, 3),Persist(inv...)如果可能的話(huà),在調(diào)用中使用可變參數(shù)擴(kuò)展。下面是帶有 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()) }}當(dāng)我使用非可變參數(shù)運(yùn)行它時(shí),對(duì) mockFunction 的調(diào)用返回本機(jī)類(lèi)型和種類(lèi),第三方包可以很好地處理它們:value 0 has Type: *float64 and Kind ptrvalue 1 has Type: *string and Kind ptrvalue 2 has Type: *int64 and Kind ptr當(dāng)我使用可變參數(shù)運(yùn)行它時(shí),值不同,第三方包不知道如何處理這些類(lèi)型: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有什么方法可以構(gòu)造切片定義并調(diào)用切片中的內(nèi)容,以便它可以進(jìn)行可變參數(shù)擴(kuò)展,并且看起來(lái)像以非可變參數(shù)方式將指針傳遞給結(jié)構(gòu)字段?
在 Go 結(jié)構(gòu)體中獲取reflect.Ptr 類(lèi)型到字段
尚方寶劍之說(shuō)
2021-08-23 15:37:34