
在 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 开发中识别多提交按钮意图的推荐实践。