2017-11-16 13 views
0

構造体の配列がinterface{}パラメータに渡されたときに、構造体の配列にデータを書き込む最良の方法はUnmarshalです。bson byte []Goで、bson byte []データを構造体の配列にアンマーシャリングする方法はありますか?

デモンストレーションの目的で、次のコードでは、タイプのデータを取得するためにinStructArrbson.Marshal()を使用します。これはを使用して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

MarshalおよびUnmarshalの機能は、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の値を使用してデコードできます。種類は配列のBSONコード(値4)を設定し、データは配列データに設定します。

func DecodeArrData(inStructArr, outStructArr interface{}) error { 
    inStructArrData, err := bson.Marshal(inStructArr) 
    if err != nil { 
     return err 
    } 
    raw := bson.Raw{Kind: 4, Data: inStructArrData} 
    return raw.Unmarshal(outStructArr) 
} 
関連する問題