【发布时间】:2014-05-11 06:14:00
【问题描述】:
我想在 Golang 中将结构转换为映射。如果我可以在创建的地图中使用 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 包源代码,因为它应该包含我需要的实现(或其中的一部分)但不太了解。
【问题讨论】:
-
您有什么特别想要实现的目标吗?如果您正在处理
mgo/bson包(由于使用了bson.M,这似乎是可能的),它不能已经从类似于encoding/json的结构执行转换吗? -
它涉及反射,包
reflect,使用起来既慢又痛苦;json包就是这样,因为使用反射很难。我的建议是使用已经为您完成反射部分的东西(对象到数据库接口,如gorp或mgo,内置包如json)或使用(可能重复)手写代码来避免反射完全。在这种情况下,在 JavaScript 中自然而有效的方法在 Go 中并不存在。 -
github.com/mitchellh/mapstructure - 但听詹姆斯的。在这种情况下,没有理由尝试这样做。
-
@eAbi 自述文件的第一行:“mapstructure 是一个 Go 库,用于将通用映射值解码为结构,反之亦然。” (强调我自己的)
-
@elithrar 是的,我看到了。很抱歉,我在那个库上看了好几次,但没有看到
vice versa。我在godoc上查看了它,但看不到如何从结构转换为映射。无论如何,谢谢。
标签: go