Mongodb 通过解组获得堆栈溢出

我想在 golang 中使用 mongodb 并编写了一个示例应用程序:


package main


import (

    "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 limit

fatal error: stack overflow


runtime stack:

runtime.throw(0x6d84d9)

        c:/go/src/runtime/panic.go:491 +0xad

runtime.newstack()

        c:/go/src/runtime/stack.c:784 +0x5ef

runtime.morestack()

        c:/go/src/runtime/asm_amd64.s:324 +0x86

我究竟做错了什么?


有只小跳蛙
浏览 275回答 1
1回答

MMMHUHU

这个逻辑引入了无限递归:func (rcv *Session) SetBSON(raw bson.Raw) error {    return raw.Unmarshal(rcv)}Session实现了Setter接口,这意味着它的解组是通过它的SetBSON方法发生的,这是通过要求bson包解组自己来实现的,这将通过调用它的SetBSON方法来实现。这永远不会结束,直到堆栈空间结束。当然,解决方案是不Session通过仅要求bson包再次解组来实现自定义解组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go