Beego中参数不会自动转换类型,字符串是默认形态;GetInt等函数仅封装strconv转换并返回error,不panic;路径参数:id只能通过c.Ctx.Input.Param(":id")安全获取,且始终为字符串。

Beego 里参数不是“自动转好”的,所有类型转换都得你主动做;字符串是默认形态,GetInt、GetInt32 等函数只是帮你做 strconv 转换,失败时返回 error,不抛 panic。
路径参数 :id 只传 string,c.Ctx.Input.Param(":id") 是唯一安全取法
AutoRouter 或 NSRouter 中写的 /user/:id,Beego 内部只把该段当字符串塞进上下文,不会尝试转 int。哪怕你定义方法为 Get(id int),编译会报错——参数名必须是 id string,且仅限动词方法(Get/Post 等)。
-
c.GetString(":id")和c.Ctx.Input.Param(":id")效果一样,但后者语义更明确,推荐用后者 -
c.GetInt(":id")看似方便,但底层调的是strconv.ParseInt(c.GetString(":id"), 10, 64),若值为空或非数字,直接返回0, error,容易掩盖逻辑错误 - 别写
c.GetInt("id")—— key 错了,永远拿不到值,也不会报错,只会返回0, nil - 同一路径不能重复用同名参数,如
/a/:id/b/:id,后一个会覆盖前一个
GetString/GetInt 等方法只查 Query + Form,不查 Path 参数
这些方法查的是请求的 query string(?key=value)和表单 body(application/x-www-form-urlencoded),跟路由里的 :id 完全无关。它们内部调用的是 c.Input().Get(key),而这个 Input() 不包含路径参数。
- 想同时支持
/user/123和/user?id=123,得手动合并:idStr := c.Ctx.Input.Param(":id"); if idStr == "" { idStr = c.GetString("id") } -
GetBool("flag")对?flag=0返回false, nil,对?flag=false也返回false, nil,但?flag=off会返回false, error—— 行为不统一,建议业务层自己用strings.EqualFold判断 -
GetFloat对科学计数法(如?x=1e2)能正常解析,但GetFloat32会因精度截断出错,优先用GetFloat64
用 ParseForm 绑定 struct 时,tag 和字段名决定映射逻辑
ParseForm(&u) 不依赖 HTTP 方法,GET/POST 都行,但它只处理表单编码数据(application/x-www-form-urlencoded 或 multipart/form-data),不处理 JSON 或路径参数。
- 字段名大写且无
formtag:按字段名匹配表单name,如Name string→ 匹配<input name="Name"> - 有
form:"username"tag:强制按 tag 值匹配,如Name string `form:"username"`→ 匹配<input name="username"> - 忽略字段:用
form:"-"或字段小写(如id int),但小写字段无法被导出,JSON 序列化也会丢 - 必须传指针:
ParseForm(u)(非指针)会 panic 报xx must be a struct pointer
JSON 请求体要手动 json.Unmarshal,ParseForm 完全无效
Beego 不会自动解析 application/json 到 struct,ParseForm 对它完全静默——既不报错也不赋值。这是新手最常踩的坑:前端发 JSON,后端还傻等 ParseForm 成功。
- 正确做法:
json.Unmarshal(c.Ctx.Input.RequestBody, &u),注意RequestBody是[]byte,且只读一次 - 如果想复用 struct tag,把
form:"xxx"改成json:"xxx",但注意form和jsontag 是两套系统,不能混用 - Body 为空时
RequestBody是nil,直接Unmarshal会 panic,需先判空:if len(c.Ctx.Input.RequestBody) == 0 { /* handle error */ } - 别用
c.Input().Get("xxx")去取 JSON 字段——它查的是 form/query,永远返回空字符串
路径参数、查询参数、表单、JSON 四种来源互不感知,Beego 没有“统一参数池”概念。哪个地方用哪类参数,得靠你脑内建模,写之前先想清楚数据从哪儿来、格式是什么、谁负责校验和转换。


















