Go言語の標準パッケージであるtext/template
について
けっこうハマってしまったのでメモとして残します。
.ParseFilesを利用する場合の、template.Newの引数
まずは以下のコードを見てください
package main
import (
tmpl "text/template"
"os"
)
func main() {
t := tmpl.Must(tmpl.New("mytemplate").ParseFiles("test.txt"))
if err := t.Execute(os.Stdout, "taqm"); err != nil {
panic(err)
}
}
■ test.txt
Hello {{ . }}
test.txtを読み込んで、"taqm"というパラメータを渡して標準出力へ吐き出しています。
実際にこのコードを実行してみると...
panic: template: "mytemplate" is an incomplete or empty template
なんか怒られた...
こういうときはじっくりエラー文言を呼んでみることが重要!
"mytemplate"は不完全または空のテンプレートです [by Google翻訳]
「中身は空じゃないし文法がおかしかったのかな?」ってことで、
テンプレートの文法がおかしいのかもう一度調べ直してみました。
template.New
をせずにtemplate.ParseFiles
だと問題なく動くことを確認。
つまりNew
していることが原因なのか?
調べているとある記事に答えはありました。
template.New
の後ろでParseFiles
を呼ぶ場合は、
ParseFiles
の引数に設定するファイルパスのファイル名を設定する必要があるらしい!
t := tmpl.Must(tmpl.New("mytemplate").ParseFiles("test.txt"))
↓ mytemplateをファイル名に変更
t := tmpl.Must(tmpl.New("test.txt").ParseFiles("test.txt"))
やっと動きました・・・^^
なんだかんだ1時間くらいハマってしまいました。
素直にエラーメッセージでGoogle検索していればもっと早くに気付けたのかもしれません。
ですが、Goの公式ドキュメント見たり、ソースコードを見たりしたので
結果的に得るものは多かったのかなと思います。
もし同じことでハマった人がすぐにこのページにたどり着けるといいなってことで!
おわり^^