gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:48:02 27 4
gpt4 key购买 nike

我想将结构转换为 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/

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