我想在 golang 中使用 mongodb 并编写了一个示例应用程序:package mainimport ( "fmt" "labix.org/v2/mgo" "labix.org/v2/mgo/bson" "os")type Session struct { Id bson.ObjectId `bson:"_id"` Data map[string]interface{} `bson:"data"`}func (rcv *Session) SetBSON(raw bson.Raw) error { return raw.Unmarshal(rcv)}type Authen struct { Name string `bson:"name"` Email string `bson:"email"`}func main() { uri := "mongodb://localhost/" if uri == "" { fmt.Println("no connection string provided") os.Exit(1) } sess, err := mgo.Dial(uri) if err != nil { fmt.Printf("Can't connect to mongo, go error %v\n", err) os.Exit(1) } defer sess.Close() sess.SetSafe(&mgo.Safe{}) collection := sess.DB("test").C("sess") a := &Authen{Name: "Cormier", Email: "cormier@example.com"} s := &Session{} s.Id = bson.NewObjectId() s.Data = make(map[string]interface{}) s.Data["logged"] = a err = collection.Insert(s) if err != nil { fmt.Printf("Can't insert document: %v\n", err) os.Exit(1) } c := &Session{} c.Id = bson.NewObjectId() c.Data = make(map[string]interface{}) err = sess.DB("test").C("sess").Find(bson.M{}).One(c) if err != nil { fmt.Printf("got an error finding a doc %v\n") os.Exit(1) }}插入到 mongodb 就像一个魅力,但解组回参考我有以下恐慌:runtime: goroutine stack exceeds 1000000000-byte limitfatal error: stack overflowruntime stack:runtime.throw(0x6d84d9) c:/go/src/runtime/panic.go:491 +0xadruntime.newstack() c:/go/src/runtime/stack.c:784 +0x5efruntime.morestack() c:/go/src/runtime/asm_amd64.s:324 +0x86我究竟做错了什么?
1 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
这个逻辑引入了无限递归:
func (rcv *Session) SetBSON(raw bson.Raw) error {
return raw.Unmarshal(rcv)
}
Session实现了Setter接口,这意味着它的解组是通过它的SetBSON方法发生的,这是通过要求bson包解组自己来实现的,这将通过调用它的SetBSON方法来实现。这永远不会结束,直到堆栈空间结束。
当然,解决方案是不Session通过仅要求bson包再次解组来实现自定义解组。
- 1 回答
- 0 关注
- 274 浏览
添加回答
举报
0/150
提交
取消