func injectEnv(c AppConfig) AppConfig { injectEnv2(&c) return c } func injectEnv2(c interface{}) { fmt.Println(">>") tmpC := c if reflect.TypeOf(c).Kind() == reflect.Ptr { tmpC = reflect.Indirect(reflect.ValueOf(c)).Interface() } t := reflect.TypeOf(tmpC) v := reflect.ValueOf(tmpC) for i := 0; i < t.NumField(); i++ { f := t.Field(i) fv := v.Field(i) fmt.Println("===") fmt.Printf("Name: %s\n", f.Name) fmt.Printf("Type: %s(%s)\n", f.Type, f.Type.Kind()) switch f.Type.Kind() { case reflect.Struct: injectEnv2(fv.Interface()) break default: break } } fmt.Println("<<") }