go - 在 Golang 中将结构转换为映射的函数

标签 go

我想在 Golang 中将结构转换为映射。如果我可以在创建的 map 中使用 JSON 标签作为键(否则默认为字段名称),那也很好。

2020 年 12 月 14 日编辑

自从 structs repo 已归档,您可以使用 mapstructure而是。

编辑 TL;DR 版本,2015 年 6 月 15 日

如果您想要将结构转换为映射的快速解决方案,请参阅 accepted answer ,点赞并使用该软件包。

编码愉快! :)


原帖

目前我有这个功能,我用的是reflect包,但是不太了解这个包怎么用,请多多包涵。

func ConvertToMap(model interface{}) bson.M {
    ret := bson.M{}

    modelReflect := reflect.ValueOf(model)

    if modelReflect.Kind() == reflect.Ptr {
        modelReflect = modelReflect.Elem()
    }

    modelRefType := modelReflect.Type()
    fieldsCount := modelReflect.NumField()

    var fieldData interface{}

    for i := 0; i < fieldsCount; i++ {
        field := modelReflect.Field(i)

        switch field.Kind() {
        case reflect.Struct:
            fallthrough
        case reflect.Ptr:
            fieldData = ConvertToMap(field.Interface())
        default:
            fieldData = field.Interface()
        }

        ret[modelRefType.Field(i).Name] = fieldData
    }

    return ret
}

我还查看了 JSON 包源代码,因为它应该包含我需要的实现(或其中的一部分)但不太了解。

最佳答案

我也需要这样的东西。我正在使用将结构转换为 map 的内部包。我决定将它与其他基于 struct 的高级函数一起开源。看看:

https://github.com/fatih/structs

它支持:

  • 将结构转换为 map
  • 将结构的字段提取到 []string
  • 将结构的值提取到 []values
  • 检查结构是否已初始化
  • 检查传递的接口(interface)是结构体还是指向结构体的指针

您可以在此处查看一些示例:http://godoc.org/github.com/fatih/structs#pkg-examples 例如将结构体转换为 map 很简单:

type Server struct {
    Name    string
    ID      int32
    Enabled bool
}

s := &Server{
    Name:    "gopher",
    ID:      123456,
    Enabled: true,
}

// => {"Name":"gopher", "ID":123456, "Enabled":true}
m := structs.Map(s)

structs 包支持匿名(嵌入)字段和嵌套结构。该软件包提供通过字段标签过滤某些字段。

关于go - 在 Golang 中将结构转换为映射的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589564/

相关文章:

mysql - 为什么 go-sql-driver 无法处理 MySQL bigint 字段中的 NULL?

go - 将映射序列化到 gob 后 DeepEqual 不正确

go - 检测哪个 Lock() 导致程序挂起?

使用 eq 和 index 的 Go 模板

go - 使用 Go 的 net/http 包连接到 YouTube API 的问题

c++ - 接收数据包发送后,等待功能等待

go - 我应该使用 Get 方法获取值还是应该直接使用字段?

go - 展平结构并将其转换为 map[string]string

Gorilla Mux 处理 curl 请求

go - 如何在 slice 中分配动态类型