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))
}

您可以在Playground 中进一步试验此代码。

于 2013-09-16T06:06:55.480 回答