
在 Go Web 开发中,可通过为 添加 name 属性,使其在 POST 提交时作为标准表单字段参与请求;随后调用 r.FormValue("name") 即可安全获取被点击按钮的 value 值,无需 JavaScript 或隐藏字段。
在 go web 开发中,可通过为 `
在 HTML 表单中,多个
因此,正确做法是统一为提交按钮指定相同的 name(例如 "submit"),并赋予不同 value:
<form action="/save" method="POST">
<div>
<span>Title: </span>
<textarea name="title" placeholder="Link">{{printf "%s" .Title}}</textarea>
</div>
<div>
<button type="submit" name="submit" value="submit1">保存为草稿</button>
<button type="submit" name="submit" value="submit2">立即发布</button>
</div>
</form>在 Go 的 HTTP 处理函数中,只需调用 r.FormValue("submit") 即可获取用户点击的按钮值:
func saveHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
// 解析表单(自动调用 ParseForm,支持 application/x-www-form-urlencoded 和 multipart/form-data)
if err := r.ParseForm(); err != nil {
http.Error(w, "Invalid form data", http.StatusBadRequest)
return
}
title := r.FormValue("title")
submitAction := r.FormValue("submit") // ✅ 关键:通过 name 获取 button 的 value
switch submitAction {
case "submit1":
log.Printf("Received draft submission: %s", title)
// 处理“保存为草稿”逻辑
case "submit2":
log.Printf("Received publish submission: %s", title)
// 处理“立即发布”逻辑
default:
http.Error(w, "Unknown submit action", http.StatusBadRequest)
return
}
http.Redirect(w, r, "/", http.StatusSeeOther)
}⚠️ 注意事项:
-
必须设置 name:仅设 value 而无 name 的
不会出现在 r.PostForm 或 r.Form 中; - r.FormValue 是安全的:它内部自动调用 r.ParseForm()(若未手动解析),且对不存在的 key 返回空字符串,无需额外判空(但业务逻辑中建议显式校验);
-
避免使用 type="image" 或 混用:若需坐标或兼容旧浏览器,应统一方案;现代场景推荐
+ name; - CSRF 防护建议:生产环境应在表单中加入一次性 token(如 csrf.Token(r)),并在 handler 中验证,防止跨站请求伪造。
该方法简洁、标准、零依赖,完全符合 HTTP 表单语义,是 Go Web 开发中识别多提交按钮意图的推荐实践。










