beego中parseform需传结构体指针(note),而非二级指针(*note);路径参数如:id默认为string,须用getint(":id")转int;int64超js安全整数范围时应fmt.sprintf("%d", id)转字符串;session取值必须显式类型断言。

Beego 中 ParseForm 要求传入结构体地址,不是指针的地址
常见错误是声明 n := &Note{} 后,再传 &n 给 ParseForm,结果反射失败、字段全为空。因为 ParseForm 需要的是可寻址的结构体值(*Note),而不是指向指针的二级指针(**Note)。
-
n := Note{}→ 传&n✅(值类型变量取地址) -
n := &Note{}→ 传n✅(已是指针,直接传) -
n := &Note{}→ 传&n❌(变成 **Note,反射无法解包) - 结构体字段必须首字母大写(导出),且
form标签名需与 HTML 的name属性完全一致
c.Ctx.Input.Param(":id") 返回 string,c.GetInt(":id") 才能转 int
AutoRouter 提取的路径参数(如 /user/:id)默认都是字符串,即使你定义方法为 Get(id int),框架也不会自动转换——它只按名字匹配 string 类型参数。真正做类型转换得靠显式调用 GetInt 等辅助方法。
-
c.Ctx.Input.Param(":id")返回string,直接用会 panic 如果后续想当数字算 -
c.GetInt(":id")内部调用strconv.Atoi,失败返回 error,不 panic -
c.GetInt("id")会失败(没冒号前缀),必须用":id"这个完整键名 - 多个同名参数(如
/a/:id/b/:id)会导致后一个覆盖前一个,别这么写
长整型 ID 返回前端必须 fmt.Sprintf("%d", id) 格式化
Go 的 int64 超过 JavaScript Number.MAX_SAFE_INTEGER(2⁵³−1 ≈ 9e15)时,JSON 序列化后前端 JS 解析会丢失精度。这不是 Beego 特有,但 Beego 默认用标准 json.Marshal,所以必须手动干预。
- 直接写
this.Data["json"] = map[string]interface{}{"id": id}(id 是 int64)→ 前端拿到的是截断/错误数值 - 正确写法:
"id": fmt.Sprintf("%d", id)→ 返回字符串,前端JSON.parse后仍是精确值 - 同理适用于所有可能超 JS 安全整数范围的字段,比如订单号、用户 UID 等
- 别依赖前端 Number() 或 parseInt() 补救,源头处理最可靠
Session 存取必须显式类型断言,this.GetSession("key").(string)
Beego 的 GetSession 返回 interface{},不做类型检查。如果存的是字符串,取的时候不加 .(string),运行时 panic;如果存的是 int,取的时候却用 .(string),同样 panic。
- 设置:
this.SetSession("userLogin", "alice")或this.SetSession("count", 42) - 取出字符串:
this.GetSession("userLogin").(string) - 取出整数:
this.GetSession("count").(int) - 不确定类型时,先用
val := this.GetSession("x"),再用switch v := val.(type)分支处理 - 在非 Controller 中操作 Session(如 Filter 函数),要用
ctx.Input.CruSession.Get(),机制相同,也要断言











