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  }