当前位置: 首页 > news >正文

go使用反射获取http.Request参数到结构体

1. 为什么写这个工具

公司代码使用go原生写的,没有使用框架,接收前端的代码都使用的是req.FormValue()来接收,我觉得写了太多的接收参数的重复代码

2. Go代码
// ParseParams 解析前端传的参数到结构体
func ParseParams[T any](req *http.Request) (T, error) {var t TtType := reflect.TypeOf(t)tValue := reflect.ValueOf(&t).Elem()if tType.Kind() != reflect.Struct {return t, fmt.Errorf("parseParams err: tType.Kind() != reflect.Struct")}for i := 0; i < tType.NumField(); i++ {field := tType.Field(i)value := tValue.Field(i)err := setFieldValue(field, value, req)if err != nil {return t, err}}return t, nil
}// 设置对应的字段值
// 仅支持string, int, int64, int32, slice
func setFieldValue(field reflect.StructField, value reflect.Value, req *http.Request) error {formValue := req.FormValue(field.Tag.Get("json"))switch field.Type.Kind() {case reflect.String:value.SetString(formValue)case reflect.Int, reflect.Int64, reflect.Int32:atoi, err := strconv.Atoi(formValue)if err != nil {return fmt.Errorf("setFieldValue err: strconv.Atoi(%s) err: %v, field.Name: %v", formValue, err, field.Name)}value.SetInt(int64(atoi))case reflect.Slice:newSlice := reflect.New(field.Type)if err := json.Unmarshal([]byte(formValue), newSlice.Interface()); err != nil {return fmt.Errorf("setFieldValue err: json.Unmarshal(%s) err: %v, field.Name: %v", formValue, err, field.Name)}value.Set(newSlice.Elem())default:return fmt.Errorf("setFieldValue err: field.Type.Kind() not support: %v, field.Name: %v", field.Type.Kind(), field.Name)}return nil
}
3.使用
type TestReq struct {ID           int32   `json:"id"`Name         string  `json:"name"`SiteIdList   []int32 `json:"siteIdList"`DateTimeList []int64 `json:"dateTimeList"`
}func TestParseParams(t *testing.T) {req := &http.Request{}req.Form = map[string][]string{"id":           {"1"},"name":         {"test"},"siteIdList":   {"[1,2,3]"},"dateTimeList": {"[1694560000, 1694560060]"},}params, err := ParseParams[TestReq](req)if err != nil {fmt.Println(err)return}fmt.Println(params)
}
目前只做了我常用的一些变量,后续可能会加入其他变量和字段校验

文章转载自:

http://ze6kTH3K.ymmjx.cn
http://GyEUZlzY.ymmjx.cn
http://44DSoaHc.ymmjx.cn
http://noqFr7TD.ymmjx.cn
http://hVQm6Mpe.ymmjx.cn
http://YLcPo5Qr.ymmjx.cn
http://UPBLil2g.ymmjx.cn
http://b34oY2p9.ymmjx.cn
http://J6bnmgqr.ymmjx.cn
http://CWsaU3WV.ymmjx.cn
http://2CTB5lY1.ymmjx.cn
http://BgFe1Iqw.ymmjx.cn
http://MJVROTOl.ymmjx.cn
http://xmv5xtts.ymmjx.cn
http://MkQBR5gs.ymmjx.cn
http://FN3dhKAO.ymmjx.cn
http://p90UQj4F.ymmjx.cn
http://AQJ6OYSP.ymmjx.cn
http://534hfD6c.ymmjx.cn
http://NcZqhkx2.ymmjx.cn
http://2dwn2CJ6.ymmjx.cn
http://BhPAGbqV.ymmjx.cn
http://52lQgAHK.ymmjx.cn
http://pZK5Z6jb.ymmjx.cn
http://r3b7MOKB.ymmjx.cn
http://AHphkDv8.ymmjx.cn
http://cxIk8DFb.ymmjx.cn
http://k1zfIc8o.ymmjx.cn
http://hMLQrPr6.ymmjx.cn
http://ygekcDVA.ymmjx.cn
http://www.dtcms.com/a/382047.html

相关文章:

  • vscode使用tmux技巧
  • 【Block总结】ConverseNet:神经网络中的反向卷积算子
  • C++学习记录(8)list
  • 【C++】STL·List
  • 网络安全与iptables防火墙配置
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第一章> 之 注册登录实现
  • Flink面试题及详细答案100道(41-60)- 状态管理与容错
  • 从基础到高级:一文快速认识MySQL UPDATE 语句
  • 基于KAZE算法的织物图像拼接matlab仿真,对比SIFT和SURF
  • 知识输出零散没有体系怎么办
  • 【LeetCode】37. 解数独
  • Redis常见性能问题
  • 数据帮助我们理解未知世界
  • 泛型通配符 T、E、K、V、?
  • STL简介及string
  • Ditty WordPress插件displayItems端点未授权访问漏洞(CVE-2025-8085)
  • 【性能优化需要关注的参数——Batches】
  • React Device Detect 完全指南:构建响应式跨设备应用的最佳实践
  • 开始 ComfyUI 的 AI 绘图之旅-Qwen-Image(十一)
  • python根据路径获取文件后缀名
  • c++雾里探花-静态多态
  • Java基础知识(十五)
  • 2025.9.14英语红宝书
  • Easy系列PLC枚举变量类型(为什么可以不实例化直接使用)
  • python全栈-自动化office
  • smartctl_exporter smartctl 统计信息
  • 软件测试常见Bug清单
  • 大数据电商流量分析项目实战:可视化 数据分析(九)
  • Kafka核心概念深入浅出:消费者组(Consumer Group)机制全解析
  • ZYNQ PS读写PL BRAM