1. ホーム
  2. go

[解決済み] Golang で構造体をマップに変換する関数

2023-06-15 16:54:20

質問

Golangで構造体をmapに変換したいです。また、作成されたマップのキーとしてJSONタグを使用できるといいのですが(それ以外の場合はフィールド名がデフォルトになります)。

2020年12月14日編集

以来 構造体 レポがアーカイブされたので マップ構造体 を使うことができます。

2015年6月15日、TL;DR版を編集します。

構造をマップに変換するための高速なソリューションが必要な場合、以下のサイトを参照してください。 受諾済み回答 を見て、それをアップヴォートして、そのパッケージを使用してください。

ハッピーコーディング! :)


オリジナル記事

今のところ、このような機能があります。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 ベースの高レベル関数と一緒にオープンソース化することにしました。見てみてください。

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 パッケージは、匿名(埋め込み)フィールドとネストされた構造体をサポートしています。このパッケージは、フィールドタグによって特定のフィールドをフィルタリングする機能を提供します。