labix.org/v2/mgo 패키지를 사용하여 MongoDb - 데이터베이스에서 가져온 내용으로 구조체의 내 보낸 필드를 채우려고합니다.mgo/bson Unmarshal이 unexported 필드를 지우지 못하도록합니다.
mgo
은 labix.org/v2/mgo/bson 패키지를 사용하여 데이터를 언 마샬링합니다. 그러나 언 마샬 러는 모든 비공유 필드를 0으로 설정합니다.
이 동작을 방지하는 방법이 있습니까?
근무 예 :
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>}
bson이 필드를 0 값으로 설정한다고 생각하지 않습니다. 리플렉션을 사용하고 반출시 반출되지 않은 필드는 리플렉션을 사용하여 설정할 수 없습니다. 대신 * Player를 완전히 새로운 Player 구조체로 대체하는 대신 내기하는 중입니다. 대신에 unexported 필드가 0 값으로 설정됩니다. 나는 네가 할 수있는 일이 있는지 의심 스럽다. –
필자는 필자는 포인터를'bson.Unmarshal'에 전달한다. 같은 메모리 주소를 가리키는 경우 어떻게 새로운 Player 구조체를 다시 얻을 수 있습니까? – ANisus
['Marshal()'] (http://godoc.org/labix.org/v2/mgo/bson#Marshal) 및 ['Unmarshal()'] (http://godoc.org/labix.org/ v2/mgo/bson # Unmarshal) 반환 오류, 당신은 그들을 확인해야 !! – thwd