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

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

通過反射提取通用結構值

通過反射提取通用結構值

Go
繁華開滿天機 2022-06-01 17:44:20
我正在嘗試將結構的所有值提取到字符串切片中。func structValues(item Item) []string {    values := []string{}    e := reflect.ValueOf(&item).Elem()    for i := 0; i < e.NumField(); i++ {        fieldValue := e.Field(i).Interface()        values = append(values, fmt.Sprintf("%#v", fieldValue))    }    return values}我想將此函數與任何結構一起使用,所以我想我可以將類型簽名更改為,func structValues(item interface{})但后來我感到恐慌:恐慌:反射:在接口值上調用反射.Value.NumField工作示例:https ://repl.it/@fny/stackoverflow61719532去
查看完整描述

1 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我想將此函數與任何結構一起使用...


您可以這樣做,但請注意它放棄了類型安全。此外,這樣做的唯一方法是允許使用任何類型的調用,而不僅僅是某種結構類型的任何類型,所以你必須檢查你得到的實際上是某種結構類型:


func structValues(item interface{}) {

    if reflect.ValueOf(item).Kind() != reflect.Struct {

        ... do something here ...

    }

進行了檢查——或者稍微推遲它,或者省略它以允許reflect恐慌——然后你需要reflect.ValueOf(&item).Elem()用更簡單的reflect.ValueOf(item).


如果您希望允許指向結構以及實際結構的指針,您可以通過使用reflect.Indirectfirst. 結果是:


func structValues(item interface{}) []string {

    e := reflect.Indirect(reflect.ValueOf(item))

    if e.Kind() != reflect.Struct {

        panic("not a struct")

    }

    values := []string{}

    for i := 0; i < e.NumField(); i++ {

        fieldValue := e.Field(i).Interface()

        values = append(values, fmt.Sprintf("%#v", fieldValue))

    }

    return values

}

reflect.Indirect如果您想確保調用者在有指針時執(zhí)行自己的間接操作,請忽略。


(注意panic這里不是很友好。如果你想要正確的調試,考慮直接用%vor打印結構%#v,或者更徹底的東西,spew 包。)


Go Playground 上的完整示例使用您type Item struct自己的鏈接。


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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