Skip to content

Instantly share code, notes, and snippets.

@unakatsuo
Created December 13, 2016 05:49
Show Gist options
  • Save unakatsuo/fb6b994c26e449aa1e5dccfbed7f8e20 to your computer and use it in GitHub Desktop.
Save unakatsuo/fb6b994c26e449aa1e5dccfbed7f8e20 to your computer and use it in GitHub Desktop.
Go flag and reflection example.
func FlagReflection(args []string) error {
opts := map[string]interface{}{}
flags := flag.NewFlagSet("xxxx", flag.ContinueOnError)
opts["vcpu"] = flags.Int("vcpu", int(mdst.MinVcpu), "")
opts["memory_gb"] = flags.Int("memory_gb", int(mdst.MinMemoryGb), "")
if err := flags.Parse(args); err != nil {
return err
}
flags.Visit(func(f *flag.Flag) {
v := reflect.ValueOf(mdst)
fv := reflect.ValueOf(opts[f.Name])
for i := 0; i < v.Elem().NumField(); i++ {
jsonTag, ok := v.Elem().Type().Field(i).Tag.Lookup("json")
if !ok {
continue
}
tagV := strings.Split(jsonTag, ",")
if tagV[0] == f.Name {
field := v.Elem().Field(i)
fmt.Println(reflect.ValueOf(f.Value).Elem().Type())
fmt.Println(v.Elem().Type().Field(i))
fmt.Println(v.Elem().Type().Field(i).Name)
fmt.Println(field.IsValid())
fmt.Println(field.CanSet())
fmt.Println(field.CanAddr())
fmt.Println(field.CanInterface())
fmt.Println(field.Kind())
fmt.Println(field.Interface())
fmt.Println(fv.Elem())
field.Set(fv.Elem().Convert(field.Type()))
}
}
})
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment