第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 結構體中獲取reflect.Ptr 類型到字段

在 Go 結構體中獲取reflect.Ptr 類型到字段

Go
尚方寶劍之說 2021-08-23 15:37:34
我正在嘗試將指向結構中字段的指針的可變參數列表傳遞給第三方包。該包接受一個可變參數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有什么方法可以構造切片定義并調用切片中的內容,以便它可以進行可變參數擴展,并且看起來像以非可變參數方式將指針傳遞給結構字段?
查看完整描述

2 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

Addr()返回字段指針的反射。對該值調用Ptr()以獲取實際指針作為接口{}。

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

playground


查看完整回答
反對 回復 2021-08-23
  • 2 回答
  • 0 關注
  • 608 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號