package handler import ( "errors" "fmt" "net/url" "reflect" ) // 解析结构体数据,写入到map中 func inspectStruct(u interface{}) (url.Values, error) { values := url.Values{} typev := reflect.TypeOf(u) if typev.Kind() != reflect.Struct { return nil, errors.New("typev.Kind() is not a reflect.Struct") } v := reflect.ValueOf(u) for i := 0; i < typev.NumField(); i++ { field := v.FieldByName(typev.Field(i).Name) // typev := reflect.TypeOf(u).FieldByName() switch field.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: values.Add(typev.Field(i).Name, fmt.Sprintf("%d", field.Int())) // fmt.Printf("field:%s type:%s value:%d\n", typev.Field(i).Name, field.Type().Name(), field.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: values.Add(typev.Field(i).Name, fmt.Sprintf("%d", field.Uint())) // fmt.Printf("field:%s type:%s value:%d\n", typev.Field(i).Name, field.Type().Name(), field.Uint()) case reflect.Bool: values.Add(typev.Field(i).Name, fmt.Sprintf("%v", field.Bool())) // fmt.Printf("field:%s type:%s value:%t\n", typev.Field(i).Name, field.Type().Name(), field.Bool()) case reflect.String: values.Add(typev.Field(i).Name, field.String()) // fmt.Printf("field:%s type:%s value:%q\n", typev.Field(i).Name, field.Type().Name(), field.String()) // default: // fmt.Printf("field:%s unhandled kind:%s\n", typev.Field(i).Name, field.Kind()) } } return values, nil }