beego 中 parseform 仅绑定数据不校验,validation 仅校验不自动取值;正确用法是先 n := note{} 再 this.parseform(&n),结构体须导出且带 form:"xxx" 标签,日志打印用 n.title 而非 &n.title,验证需显式调用 valid.struct(&n) 或手动逐字段校验。

Beego 的表单验证和数据绑定不是一回事,但必须配合使用;单独用 ParseForm 不校验,只赋值;单独用 validation 不自动取值,得手动传字段。
ParseForm 绑定失败:为什么日志里全是 %!s(*string=0xc82027a368)
这是最常踩的坑——ParseForm 要求你传入结构体变量的地址(&n),但这个结构体本身必须是值类型,不能是指针类型。
- ❌ 错误写法:
n := &Note{},再调用this.ParseForm(&n)→ 实际传的是**Note,反射找不到字段 - ✅ 正确写法:
n := Note{},再调用this.ParseForm(&n)→ 传的是*Note,字段可被正确填充 - 结构体字段必须首字母大写(导出),且带
formtag,例如:Title string `form:"title"` - 日志打印时别写
&n.Title,直接用n.Title;%s格式符不接受指针
StructTag 验证写法:哪些函数能直接写在 valid tag 里
Beego 的 validation 包支持通过结构体 tag 声明规则,但不是所有验证函数都支持——只有内置函数才认 valid tag 语法。
- 支持的函数包括:
Required、MinSize、MaxSize、Range、Email、Mobile、IP、Match(正则) - 不支持的函数(如
Min、Max、Message)只能在代码里手动调用,不能塞进 tag - tag 内多个规则用分号分隔,参数用括号包裹,例如:
`valid:"Required; Match(/^Bee.*/)"` - 正则模式必须用
/包裹,Match(/^[a-z]+$/)合法,Match("^[a-z]+$")会 panic
验证失败后怎么拿到具体错误信息
StructTag 验证走的是 validation.Validation 流程,它不和 ParseForm 自动联动;你需要显式触发验证,并自己处理错误。
- 先用
ParseForm(&n)把表单数据填进结构体 - 再创建
valid := validation.Validation{},调用valid.Struct(&n)触发 StructTag 规则 - 或者手动逐字段验证:
valid.Required(n.Name, "name") - 检查
valid.HasErrors(),遍历valid.Errors拿每个err.Key(如"Name.Required")和err.Message - 如果想统一返回前端,建议把
err.Key映射成模板变量名(如.VerifyName),避免硬编码
自定义验证逻辑:什么时候必须实现 ValidFormer 接口
StructTag 只能覆盖通用规则,复杂业务逻辑(比如“用户名不能含 admin”“密码和确认密码必须一致”)必须靠代码。
- 给结构体实现
Valid(v *validation.Validation)方法,它会在valid.Struct(&n)成功后自动调用 - 在该方法里用
v.SetError("FieldName", "错误提示")主动注入错误 - 注意:这个方法不会替代 StructTag 验证,而是补充;
valid.Struct(&n)失败时,Valid不会执行 - 密码一致性这类跨字段校验,只能在这里做;
ParseForm和 tag 都做不到
StructTag 是声明式便利,ParseForm 是绑定基础,validation 是校验引擎——三者职责分明,但缺一不可。最容易漏的是:表单绑定完没手动调用 valid.Struct,结果以为验证生效了,其实什么都没校。











