Golangのhttp.Requestを用いて、フォームのデータを配列(スライス)で受け取る方法

Golangmartiniを使ってWebアプリを作っているときに、フォームのデータを配列(厳密にはスライス)で受け取る必要があったので、その方法を記載します。

こんな感じのフォームを作成したとします。

<p>何が好き?</p>
<form method="POST" action="/post_page">
<input type="checkbox" name="foods[]" value="ごはん" />ごはん
<input type="checkbox" name="foods[]" value="ラーメン" />ラーメン
<input type="checkbox" name="foods[]" value="うどん" />うどん
<input type="checkbox" name="foods[]" value="小麦粉" />小麦粉<br />
<input type="submit" value="送信" name="submit" />
</form>

チェックボックス複数選択可能なので、選択された値を配列で受け取る必要があります。単独の値であれば、FormValueメソッドで受け取れますが、配列の場合はそれができません。

Goのソースを以下のようにすることで、フォームデータを配列で受け取ることができます。
(例として示すためのものなので、実行はできません)

package main
import (
  "github.com/codegangsta/martini-contrib/render"
  "github.com/go-martini/martini"
  "net/http"
  "fmt"
)
func main() {
  m := martini.Classic()
  m.Use(render.Renderer())  // htmlテンプレートのレンダラーの指定
  m.Get("/", formPage) // // このページでフォームを表示します
  m.Post("/post_page", postPage) // POST後のページ
  m.Run()
}
func formPage(ren render.Render) {
  ren.HTML(200, "form", nil) 
}
// !!ここから下が本題の内容です!!
func postPage(ren render.Render, req *http.Request) {
  req.ParseForm() // このメソッドを実行するとreq.Formに値が格納されます
  foods := req.Form["foods[]"] // POSTされたデータを配列(スライス)で取得
  fmt.Println(foods) // コンソールに値を表示
  ren.HTML(200, "hoge", nil)
}

重要なのは「req.ParseForm()」と「foods := req.Form["foods[]"] 」の2文です。

req.ParseFormを実行するとreq.Formにフォームの値が格納されます。

(ParseFormの返り値はError型です。エラーがあった場合に返却されるので、
エラー処理を加えたい人は、err := req.ParseForm()のようにしましょう)

foods := req.Form["foods[]"] でfoodsの中にフォームのデータが配列として格納されます。

以上です。