反射的类型官方文档
func ToMapString(in interface{}, tagName string) map[string]string {
out := make(map[string]string)
v := reflect.ValueOf(in)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil
}
t := v.Type()
for i := 0; i < v.NumField(); i++ {
fi := t.Field(i)
tagValue := fi.Tag.Get(tagName)
if tagValue != "" {
switch fi.Type.String() {
case "Int", "Int8", "Int16", "Int32", "Int64":
out[tagValue] = fmt.Sprintf("%d", v.Field(i).Int())
case "Float32", "Float64":
out[tagValue] = fmt.Sprintf("%f", v.Field(i).Float())
case "String":
out[tagValue] = v.Field(i).String()
case "Bool":
out[tagValue] = fmt.Sprintf("%v", v.Field(i).Bool())
default:
out[tagValue] = fmt.Sprintf("%v", v.Field(i).Interface())
}
}
}
return out
}
测试实例
type SearchRequest struct {
Page int64 `form:"page,default=1"`
Q string `form:"q,optional"`
Size int64 `form:"size,default=10"`
}
{
name: "fuck",
args: args{
in: &SearchRequest{
Page: 60,
Q: "133",
Size: 1,
},
tagName: "form",
},
},
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6bee854ecf0f3a756e9928dc86fb88ae.png)