到目前为止我有这个功能,我使用的是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 包源代码,因为它应该包含我需要的实现(或它的一部分)但不太了解。
我也需要这样的东西。我正在使用一个内部包,它将结构转换为地图。我决定将它与其他struct基于高级功能的开源一起使用。看一看:
struct
https://github.com/fatih/structs
它支持:
[]string
[]values
您可以在这里看到一些示例: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包支持匿名(嵌入)字段和嵌套结构。该包提供通过字段标签过滤某些字段。
structs