2013-05-05 2 views
2

labix.org/v2/mgo 패키지를 사용하여 MongoDb - 데이터베이스에서 가져온 내용으로 구조체의 내 보낸 필드를 채우려고합니다.mgo/bson Unmarshal이 unexported 필드를 지우지 못하도록합니다.

mgolabix.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>} 
+0

bson이 필드를 0 값으로 설정한다고 생각하지 않습니다. 리플렉션을 사용하고 반출시 반출되지 않은 필드는 리플렉션을 사용하여 설정할 수 없습니다. 대신 * Player를 완전히 새로운 Player 구조체로 대체하는 대신 내기하는 중입니다. 대신에 unexported 필드가 0 값으로 설정됩니다. 나는 네가 할 수있는 일이 있는지 의심 스럽다. –

+0

필자는 필자는 포인터를'bson.Unmarshal'에 전달한다. 같은 메모리 주소를 가리키는 경우 어떻게 새로운 Player 구조체를 다시 얻을 수 있습니까? – ANisus

+0

['Marshal()'] (http://godoc.org/labix.org/v2/mgo/bson#Marshal) 및 ['Unmarshal()'] (http://godoc.org/labix.org/ v2/mgo/bson # Unmarshal) 반환 오류, 당신은 그들을 확인해야 !! – thwd

답변

1

이 불가능합니다. in the source code을 볼 수 있듯이 struct 값은 필드를 채우기 전에 명시 적으로 0 값으로 설정됩니다.

이 동작을 사용하지 않도록 설정할 수있는 옵션이 없습니다. 아마도 Unmarshal()의 결과가 BSON 데이터에만 의존하고 이전의 상태가 아닌지 확인하는 것이 좋습니다.

+0

사실입니다. 나는 Jeremy wall과 같이 unexported 필드가 바뀔 수 없다는 인상을 가지고있었습니다. "[값은 주소 지정이 가능하고 unexported struct 필드를 사용하여 얻을 수없는 경우에만 변경할 수 있습니다.] (http : // golang .org/pkg/reflect/# Value.CanSet) "로 변경하십시오. 하지만 아직 전체 구조체를 0으로 설정할 수 있습니다. 알아 둘만한! – ANisus

관련 문제