LoginSignup
14
6

More than 3 years have passed since last update.

Go言語のtext/templateでNewするときの名前について

Last updated at Posted at 2018-09-10

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の公式ドキュメント見たり、ソースコードを見たりしたので
結果的に得るものは多かったのかなと思います。

もし同じことでハマった人がすぐにこのページにたどり着けるといいなってことで!

おわり^^

参考ページ

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6