今回のテーマは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の変更点について扱う予定です。
0 件のコメント:
コメントを投稿