我想要在Golang中将一个结构体转换为map。如果可以使用JSON标签作为创建的map的键(否则默认使用字段名)会更好。
编辑于2020年12月14日: 由于structs存储库已存档,您可以改用mapstructure。
编辑TL;DR版本,于2015年6月15日: 如果您想快速解决将结构转换为map的问题,请查看accepted answer,给它点赞并使用该软件包。
祝编码愉快! :)
编辑于2020年12月14日: 由于structs存储库已存档,您可以改用mapstructure。
编辑TL;DR版本,于2015年6月15日: 如果您想快速解决将结构转换为map的问题,请查看accepted answer,给它点赞并使用该软件包。
祝编码愉快! :)
原始帖子
到目前为止,我有这个函数,我正在使用反射包,但我不太理解如何使用该包,请耐心等待。
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
的结构体转换了吗? - James Henstridgereflect
,而且使用起来又慢又麻烦;json
包之所以这样,是因为使用反射很难。我的建议是要么使用已经为您完成反射部分的东西(像gorp
或mgo
这样的对象到数据库接口,内置包像json
),要么使用(可能重复的)手写代码来完全避免反射。这是一种情况,在这种情况下,在JavaScript中自然高效的方法在Go中并不适用。 - twotwotwo反之亦然
。我在godoc
上看了一下,但是没看到如何将结构体转换为映射表。不管怎样,谢谢。 - eAbi