我想在 golang 中使用 mongodb 并編寫了一個示例應(yīng)用程序: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條經(jīng)驗 獲得超8個贊
這個邏輯引入了無限遞歸:
func (rcv *Session) SetBSON(raw bson.Raw) error {
return raw.Unmarshal(rcv)
}
Session實現(xiàn)了Setter接口,這意味著它的解組是通過它的SetBSON方法發(fā)生的,這是通過要求bson包解組自己來實現(xiàn)的,這將通過調(diào)用它的SetBSON方法來實現(xiàn)。這永遠不會結(jié)束,直到堆棧空間結(jié)束。
當(dāng)然,解決方案是不Session通過僅要求bson包再次解組來實現(xiàn)自定義解組。
- 1 回答
- 0 關(guān)注
- 290 瀏覽
添加回答
舉報
0/150
提交
取消