Skip to content

Instantly share code, notes, and snippets.

@rxda
Last active May 12, 2020 06:09
Show Gist options
  • Save rxda/872e5fb9d8176cd8fb90a0dea0133421 to your computer and use it in GitHub Desktop.
Save rxda/872e5fb9d8176cd8fb90a0dea0133421 to your computer and use it in GitHub Desktop.
func initStruct(p reflect.Type) (instance reflect.Value) {
instance = reflect.New(p).Elem()
if p.Kind() == reflect.Slice {
instance.Set(reflect.Append(instance, initStruct(p.Elem())))
return instance
}
for i := 0; i < p.NumField(); i++ {
switch instance.Field(i).Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
fallthrough
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
instance.Field(i).SetInt(10010)
case reflect.Float32, reflect.Float64:
instance.Field(i).SetFloat(100.86)
case reflect.String:
instance.Field(i).SetString("12345")
case reflect.Bool:
instance.Field(i).SetBool(true)
case reflect.Slice:
instance.Field(i).Set(reflect.Append(instance.Field(i), initStruct(instance.Field(i).Type())))
case reflect.Struct:
instance.Field(i).Set(initStruct(instance.Field(i).Type()))
case reflect.Ptr:
instance.Field(i).Set(initStruct(instance.Field(i).Elem().Type()).Addr())
case reflect.Map:
key := initStruct(instance.Field(i).Type().Key())
value := initStruct(instance.Field(i).Type().Elem())
instance.Field(i).SetMapIndex(key, value)
default:
continue
}
}
return instance
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment