2017-11-16 2 views
0

구조체 배열이 interface{} 매개 변수로 전달 될 때 Unmarshalbson 바이트 [] 데이터를 구조체 배열에 저장하는 가장 좋은 방법은 무엇입니까?이동에서 bson byte [] 데이터를 구조체 배열에 Unmarshal하는 방법?

데모 목적으로 다음 코드에서 데이터 형식을 얻으려면 inStructArrbson.Marshal()을 사용합니다. 이것은 bson.Unmarshal(...)을 사용하여 outStructArr에 파이프 할 수 있습니다. 나는이 작업을 수행 할 때

import "gopkg.in/mgo.v2/bson" 

type User struct { 
    Name string 
} 

func DecodeArrData(inStructArr, outStructArr interface{}) { 
    inStructArrData, _ := bson.Marshal(inStructArr) 
    bson.Unmarshal(inStructArrData, outStructArr) // <-- Error happens here 
    // What's the right way of accomplishing this? 
} 

func Main() { 
    outUsers := &[]User{} 
    inUsers := []User{User{"A"}, User{"B"}} 

    DecodeArrData(inUsers, outUsers) 
} 

, 내가 오류 메시지는 다음과 같습니다 Unsupported document type for unmarshalling: []User. 이 작업을 수행하는 올바른 방법은 무엇입니까?

미리 감사드립니다.

답변

0

MarshalUnmarshal 기능은 BSON 문서가 아닌 BSON 문서와 함께 작동합니다.

랩 패키지가 기대하는 문서를 제공하는 구조체의 조각 :

func DecodeArrData(inStructArr, outStructArr interface{}) error { 
    in := struct{ Data interface{} }{Data: inStructArr} 
    inStructArrData, err := bson.Marshal(in) 
    if err != nil { 
     return err 
    } 
    var out struct{ Data bson.Raw } 
    if err := bson.Unmarshal(inStructArrData, &out); err != nil { 
     return err 
    } 
    return out.Data.Unmarshal(outStructArr) 
} 

당신은 Marshal 기능의 문서화되지 않은 기능을 활용하고 응용 프로그램에 일부 BSON 형식의 지식을 추가하고자하는 경우 래퍼를 생략 할 수 있습니다.

Marshal의 문서화되지 않은 기능은 슬라이스를 BSON 배열로 인코딩한다는 것입니다. BSON 배열은 bson.Raw 값을 사용하여 해독 할 수 있습니다. 종류는 배열 (값 4)에 대한 BSON 코드를 설정하고 데이터는 배열 데이터로 설정합니다.

관련 문제