[解決済み] Golang で構造体をマップに変換する関数
質問
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
パッケージは、匿名(埋め込み)フィールドとネストされた構造体をサポートしています。このパッケージは、フィールドタグによって特定のフィールドをフィルタリングする機能を提供します。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] Goプロジェクトの賢明なレイアウト方法とは [終了しました]。
-
[解決済み] ゴルーチンのスタックトレースをダンプするには?
-
[解決済み] sync.WaitGroupの例は正しいですか?
-
[解決済み] Goエラー処理テクニック【終了しました
-
[解決済み] ゴルーチンからの戻り値をキャッチする
-
[解決済み] マップを含む値を順番に収集する
-
[解決済み] Go で POST リクエストを送信するには?
-
[解決済み] 標準入力から整数を読み込む
-
[解決済み] env varが空の場合、どのようにデフォルト値を割り当てるのですか?