我正在玩Martini,由于某些原因我无法使用contrib绑定包。
我的结构没有绑定的值。我已经将代码缩减为最简单的形式,但它仍然不起作用。
谁能看到我做错了什么?
package main
import (
"github.com/go-martini/martini"
"github.com/martini-contrib/binding"
"net/http"
)
var html string = `<form method="POST" enctype="application/x-www-form-urlencoded"><input name="un" type="text" /><input type="submit" value="Some button" /></form>`
type FormViewModel struct {
Username string `form: "un"`
}
func main() {
m := martini.Classic()
m.Get("/", func(w http.ResponseWriter) {
w.Header().Add("content-type", "text/html")
w.Write([]byte(html))
})
m.Post("/", binding.Form(FormViewModel{}), func(vm FormViewModel) string {
return "You entered: " + vm.Username
})
m.Run()
}
答案 0 :(得分:1)
这只是与结构字段关联的标记定义中的解析问题。
您需要在表单后删除空白字符:
如果您按如下方式编写结构:
type FormViewModel struct {
Username string `form:"un"` // No blank after form:
}
......它应该更好。
Go语言规范说:
按照惯例,标记字符串是可选的空格分隔键的串联:&#34;值&#34;对。每个键都是一个非空字符串,由空格以外的非控制字符组成(U + 0020&#39;&#39;),引用(U + 0022&#39;&#34;&#39;),和冒号(U + 003A&#39;:&#39;)。每个值都使用U + 0022&#39;&#34;&#39;字符和Go字符串文字语法。
显然,the reflect package中实现的解析器在冒号后不能容忍空格。