小编典典

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

go

到目前为止我有这个功能,我使用的是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 包源代码,因为它应该包含我需要的实现(或它的一部分)但不太了解。


阅读 229

收藏
2021-12-20

共1个答案

小编典典

我也需要这样的东西。我正在使用一个内部包,它将结构转换为地图。我决定将它与其他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包支持匿名(嵌入)字段和嵌套结构。该包提供通过字段标签过滤某些字段。

2021-12-20