这里有点鸡蛋和鸡蛋的问题。
在HTML模板中,需要使用{{mytype.Id.Hex()}}
e.g。
<form method="post">
<input name="id" value="{{mytype.Id.Hex()}}>
</form>
在Go中定义一个应该由gorilla / schema
解析的结构type MyType struct {
Id bson.ObjectId `bson:"_id,omitempty" schema:"id"`
}
致电时(来自架构)decoder.Decode(instance_of_mytype, r.PostForm)
它&#34;抛出&#34;错误:schema: invalid path "id"
因为格式只是bson.ObjectId的字符串respresentation而不是实际的bson.ObjectId。
我想知道除了手动填充字段(r.FormValue()
)以使其工作之外我能做些什么。
我应该使用gorilla / schema或mgo创建问题,还是应该手动执行?
答案 0 :(得分:0)
您可以定义自己的基于字符串的类型,该类型包含值的十六进制表示,并在其上实现bson.Getter和bson.Setter接口。 Gorilla将忽略这些接口并使用字符串值,bson将忽略字符串值并使用接口。
这些内容(未经测试的代码):
type hexId string
func (id hexId) GetBSON() (interface{}, error) {
return bson.ObjectIdHex(string(id)), nil
}
func (id *hexId) SetBSON(raw bson.Raw) error {
var objId bson.ObjectId
err := raw.Unmarshal(&objId)
if err != nil {
return err
}
*id = hexId(objId.Hex())
return nil
}