1 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
如果我正確理解了您的要求,那么就沒有必要使用unsafe
. 要獲取指向字段的指針,您只需使用Value.Addr
方法和類型斷言來獲取具體類型。
func GenerateFlags(in interface{}, fs *flag.FlagSet, names []string) {
rv := reflect.ValueOf(in)
if rv.Kind() != reflect.Ptr || rv.Elem().Kind() != reflect.Struct {
return // exit if not pointer-to-a-struct
}
rv = rv.Elem()
rt := rv.Type()
for i := 0; i < rt.NumField(); i++ {
sf := rt.Field(i)
fv := rv.Field(i)
name := strings.Join(append(names, strings.ToLower(sf.Name)), ".")
switch fv.Type() {
case reflect.TypeOf(string("")):
p := fv.Addr().Interface().(*string)
fs.StringVar(p, name, "", "")
case reflect.TypeOf(int(0)):
p := fv.Addr().Interface().(*int)
fs.IntVar(p, name, 0, "")
case reflect.TypeOf(float64(0)):
p := fv.Addr().Interface().(*float64)
fs.Float64Var(p, name, 0, "")
default:
names := append([]string{}, names...)
GenerateFlags(fv.Interface(), fs, append(names, strings.ToLower(sf.Name)))
}
}
}
https://go.dev/play/p/1F2Kyo0cBuj
- 1 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報