为了账号安全,请及时绑定邮箱和手机立即绑定

Mongodb 通过解组获得堆栈溢出

Mongodb 通过解组获得堆栈溢出

Go
有只小跳蛙 2021-09-20 11:01:49
我想在 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包再次解组来实现自定义解组。


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 274 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信