尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

go使用反射获取http.Request参数到结构体 - 实践
📅 发布时间:2026/6/22 2:08:34

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

1. 为什么写这个工具

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

2. Go代码
// ParseParams 解析前端传的参数到结构体
func ParseParams[T any](req *http.Request) (T, error) {
var t T
tType := 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)
}
目前只做了我常用的一些变量,后续可能会加入其他变量和字段校验

相关新闻

  • centos7中mysql环境配置
  • Symfony学习笔记 - 利用Doctrine开发一个学生信息的增删查改
  • 实时内核中的调度程序节流

最新新闻

  • RISE算法:基于CountSketch与稀疏激活的大模型数据影响力高效估计
  • UI自动化测试面试核心能力与高频问题深度解析
  • 数据中心电源平滑系统硬件设计:维也纳整流与DAB拓扑实战解析
  • 测度传输与生成建模:理论基础与应用实践
  • AI模型部署失败真相:模型ID映射与三重命名体系解析
  • 3个颠覆性视角:如何用Sunshine重新定义你的游戏串流体验

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号