我解析了一堆標志,然后嘗試將這些值分配給結構中的字段,但是我很難將解析的標志值設置到結構中,因為我無法鍵入斷言或強制轉換它.這是我擁有的代碼片段。過分擔心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.Value
flag.Value
是一種抽象各種標志值的接口類型。正如您的代碼所示,它不是類型bool
,而是一些 non-exported *flag.boolValue
。你不應該關心它的動態類型。
您可以使用該Value.String()
方法將其值作為 a 來獲取string
,這將是"false"
或者"true"
對于 bool 類型,您可以使用簡單的比較來從中獲取bool
a f.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))
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消