1

現在、これは map[string]interface{} を Message 構造体に変換するために使用する方法です

byteBlob, err := json.Marshal(messageMap)
if err != nil {
    return nil, err
}

message := &Message{}
err = json.Unmarshal(byteBlob, message)
if err != nil {
    return nil, err
}

これをハックする json パッケージを見つけましたが、この変換を行う正しい方法は何ですか? 明らかにjsonパッケージを使用せずに

4

1 に答える 1

2

パッケージは、encoding/jsonパッケージを使用してreflectメッセージをマーシャリングおよびアンマーシャリングします。

したがって、reflect直接同じことを行うことができます。ネストされた構造体と配列のサポートが必要ない場合は、次のようにしてください。

message := Message{}

v := reflect.ValueOf(&message).Elem()
for key, value := range messageMap {
    field := v.FieldByName(key)
    if !field.IsValid() {
        // or handle as error if you don't expect unknown values
        continue
    }
    if !field.CanSet() {
        // or return an error on private fields
        continue
    }
    field.Set(reflect.ValueOf(value))
}

このコードをプレイグラウンドでさらに試すことができます。

于 2013-09-16T06:06:55.480 に答える