这是我读过的一个BUG,想知道是否有人对我的用例有特别的建议,因为我不确定它什么时候会得到修复(最后我阅读了1.4)。
我正在将 JSON 解码为以下结构:
User struct {
ID_ bson.ObjectId `bson:"_id,omitempty" json:"_id,omitempty"`
UTC *time.Time `bson:"utc,omitempty" json:"utc,omitempty"`
USR string `bson:"usr,omitempty" json:"usr,omitempty"`
PWD string `bson:"pwd,omitempty" json:"pwd,omitempty"`
}
然后使用 MGO 更新 USR 和 PWD 字段:
func save(w http.ResponseWriter, r *http.Request) {
m := s.Copy()
defer m.Close()
user := m.DB("0").C("user")
var a User
json.NewDecoder(r.Body).Decode(&a)
b := &User {USR:a.USR, PWD:a.PWD}
user.UpdateId(a.ID_, b)
}
当我在结构定义中有 time.Time 时,我得到一个零日期值,这会将我在 Mongo Doc 中的日期重置为 UNIX 开始。当我使用 *time.Time 时,我得到一个 nil 日期值,这完全从我的 Mongo Doc 中删除了我的日期字段。这是代码:
任何想法如何使这项工作?我宁愿不为每个调用创建一个新结构——本质上重用我的用户结构(本质上是我的数据库集合模式)很好。
当前状态:
一些很棒的评论和解决方案,谢谢大家。但是,我仍然对“省略”的不一致行为感到困惑。当它是一个字符串 && 为空时,它在解码后的结构中真正被省略了。但是,当它是 time.Time/bson.ObjectId 时,它在为空时归零,或者 *time.Time/*bson.ObjectId 在空时为零。如果它们真的被省略了,那就太好了。然后我们可以一遍又一遍地重用这个结构(不需要非常明确——这基本上是绕过那些零/零值的额外工作)。