go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/fu/fields.go (about) 1 package fu 2 3 import "reflect" 4 5 func FieldsOf(s interface{}) []string { 6 v := reflect.TypeOf(s) 7 for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { 8 v = v.Elem() 9 } 10 if v.Kind() != reflect.Struct { 11 panic("only struct{} and &struct{} allowed as an argument") 12 } 13 r := []string{} 14 for i := 0; i < v.NumField(); i++ { 15 r = append(r, v.Field(i).Name) 16 } 17 return r 18 } 19 20 func AsMap(s interface{}) map[string]reflect.Value { 21 v := reflect.ValueOf(s) 22 for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { 23 v = v.Elem() 24 } 25 if v.Kind() != reflect.Struct { 26 panic("only struct{} and &struct{} allowed as an argument") 27 } 28 vt := v.Type() 29 r := map[string]reflect.Value{} 30 for i := 0; i < vt.NumField(); i++ { 31 r[vt.Field(i).Name] = v.Field(i) 32 } 33 return r 34 }