gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:58:42 24 4
gpt4 key购买 nike

我想在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com