我尝试使用从MongoDb软件包从labix.org/v2/mgo -database获取的内容填充结构的导出字段。
mgo使用labix.org/v2/mgo/bson数据包将数据解码。但是解码器会将所有未导出的字段设置为零值。

有什么办法可以防止这种行为?

工作示例:

package main

import (
    "fmt"
    "labix.org/v2/mgo/bson"
)

type Sub struct{ Int int }

type Player struct {
    Name       string
    unexpInt   int
    unexpPoint *Sub
}

func main() {
    dta,err := bson.Marshal(bson.M{"name": "ANisus"})
    if err != nil {
        panic(err)
    }

    p := &Player{unexpInt: 12, unexpPoint: &Sub{42}}

    fmt.Printf("Before: %+v\n", p)
    err = bson.Unmarshal(dta, p)
    if err != nil {
        panic(err)
    }
    fmt.Printf("After: %+v\n", p)
}

输出:
Before: &{Name: unexpInt:12 unexpPoint:0xf84005f500}
After: &{Name:ANisus unexpInt:0 unexpPoint:<nil>}

最佳答案

这是不可能的。如您所见in the source code,在填写任何字段之前,struct值已显式设置为零值。

没有选项可以禁用此行为。大概可以确保Unmarshal()的结果仅取决于BSON数据,而不取决于任何先前状态。

关于mongodb - 防止mgo/bson Unmarshal清除未导出的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16388210/

10-10 10:09