こんにちは。KOUKIです。
最近、Go言語のtext/templateパッケージを使ってテンプレート活用プログラムを作成したので、text/templateの使い方をまとめておこうと思います。
<目次>
事前準備
ワークディレクトリを作成してください。
1 2 3 4 |
mkdir template-pro cd template-pro touch tpl.gohtml touch main.go |
標準出力にテンプレートを表示する
text/templateはGo言語でテンプレートを使ったプログラムを実装するのを手助けしてくれるパッケージです。
ここでは、tpl.gohtmlがテンプレートです。簡単にサンプルを書いてみました。
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello World!</title> </head> <body> <h1>Hello</h1> </body> </html> |
この内容を標準出力に表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "html/template" "log" "os" ) // OutputStd output somthing on stdout func OutputStd(tpl *template.Template) { err := tpl.Execute(os.Stdout, nil) if err != nil { log.Fatalln(err) } } func main() { tpl, err := template.ParseFiles("tpl.gohtml") if err != nil { log.Fatalln(err) } OutputStd(tpl) } |
ttemplate.ParseFilesにて、テンプレートファイルをパースし、template.Executeの第一引数にos.Stdout(標準出力)を指定するとテンプレートの中身を標準出力に表示することが可能です。
プログラムを実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
$ go run main.go <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello World!</title> </head> <body> <h1>Hello</h1> </body> </html> |
ファイルに出力する
次に、テンプレート内容をファイルに出力する方法をみていきます。

これが中々情報がなかったんですよね。
template.Execは第一引数にio.Writerを渡します。
Writerはinterfaceで以下のようなコードです。
1 2 3 |
type Writer interface { Write(p []byte) (n int, err error) } |
つまり、Writeメソッドを実装していれば第一引数に渡すことが可能です。このあたりは、Go言語を知らないとわからないですね。。
例えば、osパッケージのCreateメソッド(ファイル作成)を見てみましょう。
1 2 3 |
func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) } |
この関数は、*Fileを返しますね。定義は以下のようになっています。
1 2 3 |
type File struct { *file // os specific } |
そしてこれはWriteメソッドを実装しています。
1 2 3 |
func (f *File) Write(b []byte) (n int, err error) { ... } |
Goではインターフェースに定義した関数を実装すると暗黙的にインターフェースを継承したことにしてくれます。そのため、ExecメソッドにCreateメソッドの戻り値を渡すことが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package main import ( "html/template" "log" "os" ) // SaveToFile save your wanted file func SaveToFile(tpl *template.Template) { nf, err := os.Create("index.html") if err != nil { log.Println("error creating file", err) } defer nf.Close() err = tpl.Execute(nf, nil) if err != nil { log.Fatalln(err) } } func main() { tpl, err := template.ParseFiles("tpl.gohtml") if err != nil { log.Fatalln(err) } SaveToFile(tpl) } |
このプログラムを実行するとindex.htmlファイルが出力されます。
1 2 3 |
$ go run main.go $ ls index.html main.go tpl.gohtml |
おわりに
ここでは、標準出力とファイルへの書き込み方法を紹介しました。
しかし、あくまで機能としてはごくごく一部です。
また便利な使い方を見つけたら、追記していこうと思います。
最近のコメント