· 1.2 rc1 encoding/json golang Go言語 map reflect struct

#golang mapからstructに変換するには?

  • このエントリーをはてなブックマークに追加

reflect pkgを使った方法

最初はなんとなくリフレクションを使ってやるのかなぁと思って、調べてたらこんな感じのが出てました。(参考リンク

http://play.golang.org/p/5Inl2jO7zL

encoding/json pkgを使った方法

ただちょっとこれだと扱いにくくて(MapToStructの中身を修正すれば扱いやすくなるかもしれないですが)、パフォーマンスを気にしなければ、mapを一旦JSONにして、そのJSONをstructにするという方法が扱いやすいということを教えてもらいました。

http://play.golang.org/p/Kd7TRoRG5w

ライブラリmapstructureを使う方法

https://github.com/mitchellh/mapstructure

mapstructure.Decode関数を使えばよさげ。

補足:mapから map[string]interface{}に変換する方法

最初は、MapToStructの第一引数にmap[string][]stringをそのまま渡してて、valueのところがスライスだったらだめなのかな?と思ってましたが、map[string]interface{}に変換すればいいだけってのを教えてもらって、次のような変換で解決しました。

m := map[string][]string{
    "1":[]string{"a","b"},
    "2":[]string{"C","d"},
}
// convert map to a map[string]interface{}
mi := make(map[string]interface{}, len(m))
for k, v := range mm {
    mi[k] = v
}

補足:個人的なきっかけ

var r *http.Request
r.Form (= url.Values = map[string][]string)

POSTリクエストがきた時のr.Formを構造体に一時的に格納したいのですが、格納先の構造体のフィールドがやたら多い場合、一個ずつ格納するのが面倒だなというのがきっかけでした。

参考

  • このエントリーをはてなブックマークに追加
  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket