2013年12月5日木曜日

Golang Cafe #6を開催しました。

Golang Cafe #6を開催しました。

今回のテーマはtext/templateパッケージの使い方が主なテーマになりました。

リポジトリはgithubにありますので、作成したコードはそちらを参照して下さい。

始まる前に、「Goで複数行にわたって記述する方法」について話題になったので、
そのことを調べました。
Goの場合は、明示的に「次の行に続く」事を書いておけば大丈夫なようです。
以下の例だと、正しく動きますが、
 str :=  "Hello" +
 " World!" +
 " Hoge!"

 n := Name("hoge")

 n.
  Print()

以下の例だとコンパイルエラーになります。
 str :=  "Hello"
 + " World!"
 + " Hoge!"

 n := Name("hoge")

 n
 .Print()

最初に簡単な使い方を紹介しました。

templateに任意の値を追加する時は、{{.Name}}というようにテンプレートを追加します。
先頭の"."はtemplate.Execute()で指定した引数のオブジェクトを示しています。
したがって、構造体を指定した場合は、メンバを指定することも可能です。標準の型の変数を指定した場合は"."と指定することで値を表示させる事が可能になります。

次に{{range $index, $element := .}}{{end}}とすると、rangeキーワードを使ったfor文と同じことを実現できます。先頭に$が付いたものはテンプレート内変数でrange以外でも使うことができます。
要素が0件だった時に、0件の処理をしたい場合は{{else}}を記述しておくと、else側が処理されるようになります。

{{if .Flag}}{{else}}{{end}}などとすると、テンプレート内での条件分岐が実現できます。
.Flagは判定条件です。

{{len .}}とすると、引数で渡された値の長さが取得できます。len()を呼び出しているのと同じ意味になります。これを使って、「取得件数:XX件」という事が実現できます。

templateはファイルに記述しておき、ファイルの内容から生成することも可能になっています。
t := template.Must(template.ParseFiles("sample.txt"))
とすると、sample.txtに書かれたテンプレートを読み取り、正しく記述されていればTemplateオブジェクトが取得されます。しかし、記述に誤りがある時は、panicになります。template.Must()はtemplateが必ず生成できることをチェックする関数です。
テンプレートが動的に変わるなど、正誤があいまいな時はMust()は使わないほうがいいでしょう。

また、template.ParseFiles()は複数のファイルを指定して一括で読み込めるので、
以下のように、複数のファイルを読み込ませても構いません。
t := template.Must(template.ParseFiles("sample.txt", "sample2.txt"))

テンプレートには名前をつけるようになっていて、template.ParseFiles()で読み込ませた時のテンプレート名はファイル名がそのまま付きます。
特定のテンプレートを取得したい時は、t.Lookup("sample2.txt")などとテンプレート名を指定してオブジェクトを取得します。

特定のテンプレートを指定してテキストを出力する時は、
err := t.ExecuteTemplate(os.Stdout, "sample2.txt", members)
のように、ExecuteTemplate()を呼び出すと可能です。2番目の引数がテンプレートの名前です。

次回のGolang Cafe#7は先週(今週?)リリースされたGo1.2の変更点について扱う予定です。