go - 映射 <-> 结构类型转换

标签 go

目前这是我用来将 map[string]interface{} 转换为 Message struct 的方法

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 包

最佳答案

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

您可以使用此代码进一步试验 in the playground .

关于go - 映射 <-> 结构类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18821038/

相关文章:

hadoop - 用于 Hadoop Streaming 的 Go 客户端

garbage-collection - 垃圾收集和cgo

Go goroutine 与 channel 奇怪的结果

go - 被调用的 Go 包中的全局变量

makefile - 如何在不使用 make 的情况下使用 cgo?

go - Bazel 构建、protobuf 和代码完成

json - 如何将 map 嵌入到结构中,使其具有平面 json 表示

google-app-engine - 使用go在应用程序引擎中包含电子邮件 header ?

regex - 如何将正则表达式应用于文件中的内容(Go)?

go - 如何去 :generate stringer constants from multiple packages?