必须显式调用 r.parsemultipartform(32

ParseForm 之前必须处理 multipart 表单
如果你的表单是 multipart/form-data(含文件上传或混合字段),只调用 r.ParseForm() 是不够的——r.PostForm 会为空,r.MultipartForm 为 nil,所有字段读不到。
- 必须显式调用
r.ParseMultipartForm(32 (例如 32MB 缓存) - 或者提前设置
r.MaxMemory = 32 ,再调用 <code>r.ParseForm() - 不设
MaxMemory直接调用ParseMultipartForm会用默认 32KB,小表单也可能因缓冲不足跳过解析 - 纯
application/x-www-form-urlencoded表单可直接r.ParseForm()
PostFormValue 和 FormValue 别混用
r.FormValue("name") 会同时查 URL 查询参数和 POST body,而 r.PostFormValue("name") 只查 POST body。多数登录/注册表单是 POST 提交,用后者更安全。
- 攻击者可能在 URL 里加
?email=admin%40example.com来绕过校验,如果用了FormValue就会被覆盖 - GET 表单(如搜索)才适合用
FormValue - 两者对缺失 key 都返回空字符串,不是
nil,判断空值要用== "",不是== nil
validator.Struct() 不调用就等于没校验
给结构体打 validate:"required,email" 标签只是声明规则,真正触发校验必须显式调用 v.Struct() 并检查返回的 error。漏掉这步,校验完全失效。
- 字段必须首字母大写(导出),否则
validator读不到标签 - 标签值里不能有空格:
validate:"required,max=10"对,validate:"required, max=10"错 -
required对 string 只判零值"",不清理空格——用户输" "也能过,得先strings.TrimSpace() - Gin 的
c.ShouldBind()默认不启用validate标签,需确保结构体同时带json和validate标签,并确认框架配置已加载 validator 实例
邮箱、数字、日期这些字段别信简单字符串判断
手动校验不是偷懒写 strings.Contains(email, "@") 或 strconv.Atoi(age) 就完事——边界情况一抓一大把。
- 邮箱:用
mail.ParseAddress(email)比正则更可靠,它能识别合法但非典型的格式(如带引号、+ 号) - 数字字段:
strconv.Atoi失败时返回 0 和 error,别忽略 error 直接用返回值,否则"abc"会变成0被误认为有效 - 日期:
time.Parse("2006-01-02", dateStr)必须用 Go 的固定 layout,错一个字符就 panic;前端传时间戳的话,优先用time.Unix() - 布尔字段(如 checkbox):未勾选时 key 根本不出现在
r.PostForm中,不能== "on",而应判断r.PostFormValue("subscribe") != ""
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











