亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

反射結構字段。使用標志指針值設置

反射結構字段。使用標志指針值設置

Go
RISEBY 2022-06-21 16:51:17
我解析了一堆標志,然后嘗試將這些值分配給結構中的字段,但是我很難將解析的標志值設置到結構中,因為我無法鍵入斷言或強制轉換它.這是我擁有的代碼片段。過分擔心IterFields函數并不重要,基本上結構中的每個字段都會調用第三個參數...注意:下面的代碼中有注釋突出顯示錯誤。    flag.Parse()    IterFields(st, v, func(field reflect.Value, sf reflect.StructField) {        flag.VisitAll(func(f *flag.Flag) {            if f.Name == strings.ToLower(sf.Name) || f.Name == sf.Tag.Get("short") {                fmt.Printf("%+v, %T\n", f.Value, f.Value)                // PRINTS: true, *flag.boolValue                                if v, ok := f.Value.(bool); ok {                    fmt.Println("ok")                } else {                    fmt.Println("not ok")                }                // ERROR: impossible type assertion: bool does not implement flag.Value (missing Set method)                                field.Set(reflect.ValueOf(f.Value))                // PANIC: value of type *flag.boolValue is not assignable to type bool            }        })    })
查看完整描述

1 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

f.Valueflag.Value是一種抽象各種標志值的接口類型。正如您的代碼所示,它不是類型bool,而是一些 non-exported *flag.boolValue。你不應該關心它的動態類型。

您可以使用該Value.String()方法將其值作為 a 來獲取string,這將是"false"或者"true"對于 bool 類型,您可以使用簡單的比較來從中獲取boolf.Value.String() == "true"。

但更好的方法是:flag.Value來自flag包的所有值也都實現flag.Getter,它也有一個Get()方法,可以bool在布爾標志的情況下直接返回一個值(interface{}當然包裝在里面)。只需使用它:

field.Set(reflect.ValueOf(f.Value.(flag.Getter).Get()))

以上適用于任何類型的字段(假設標志的值類型可分配給字段的類型)。

僅對于bool字段,或者您也可以使用:

field.SetBool(f.Value.(flag.Getter).Get().(bool))


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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