小编典典

在Golang中将结构转换为地图的函数

go

我想将一个结构转换为Golang中的地图。如果我可以在创建的地图中使用JSON标签作为键(否则默认为字段名称),那也将很好。

编码愉快!:)


原始帖子

到目前为止,我具有此功能,我正在使用反射包,但我不太了解如何使用该包,请多多包涵。

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包的源代码,因为它应该包含我所需的实现(或部分实现),但理解得并不多。


阅读 274

收藏
2020-07-02

共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程序包支持匿名(嵌入式)字段和嵌套结构。该软件包提供了通过字段标签过滤某些字段的功能。

2020-07-02