我想将结构转换为 Golang 中的映射。如果我可以在创建的地图中使用 JSON 标签作为键(否则默认为字段名称),那也很好。
编辑 2020 年 12 月 14 日
由于 structs repo 已存档,您可以改用 mapstructure 。
编辑 TL;DR 版本,2015 年 6 月 15 日
如果您想要将结构转换为映射的快速解决方案,请参阅已 接受的答案,对其进行投票并使用该包。
编码愉快! :)
原帖
到目前为止我有这个功能,我正在使用反射包但我不太了解如何使用该包,请耐心等待。
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 包源代码,因为它应该包含我需要的实现(或部分实现)但不太了解。
原文由 eAbi 发布,翻译遵循 CC BY-SA 4.0 许可协议
我也需要这样的东西。我正在使用一个将结构转换为地图的内部包。我决定将它与其他基于
struct
的高级函数一起开源。看一看:https://github.com/fatih/structs
它支持:
[]string
[]values
您可以在此处查看一些示例:http: //godoc.org/github.com/fatih/structs#pkg-examples 例如,将结构转换为地图很简单:
structs
包支持匿名(嵌入式)字段和嵌套结构。该包提供了通过字段标签过滤某些字段的功能。