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

标签 go

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

编辑 2020 年 12 月 14 日

structs repo 已存档,您可以使用 mapstructure相反。

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

如果您想要将结构转换为映射的快速解决方案,请参阅 accepted answer , upvote 它并使用那个包。

编码愉快! :)


原帖

到目前为止我有这个功能,我正在使用反射包但我不太了解如何使用该包,请耐心等待。

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

它支持:

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

你可以在这里看到一些例子:http://godoc.org/github.com/fatih/structs#pkg-examples 例如,将结构转换为映射很简单:

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/34372786/

相关文章:

go - 类型错误返回 grpc tls 凭据的接口(interface)

runtime - GOMAXPROCS 默认值是多少?

Golang kubernetes go-client 将 Deployment 转换到 DeploymentList

go - 运行线程一定时间 - 在被杀死之前

linux - 在 Raspberry Pi 上安装 Go 包

sql-server - 使用GORM在同一张表上设置两个外键时,MS-SQL服务器引发错误

go - Go 语言中的潜在竞争条件

go - 在 go mod 下载期间获取错误未知修订依赖

regex - 如何在Go中将正则表达式与反向引用匹配?

其他语言的 Goroutine 类似物