まず結論
違いは使用するTemplateを明示するか否かです。
template.ParseFiles
で読み込んだファイルが
- 1つのみの場合
-
Execute
もしくはExecuteTemplate
を使う
-
- 複数の場合
-
ExecuteTemplate
を使う
-
基本的にExecuteTemplate
を使っておけば良い気がします。
実行してみる
Goのversionは1.12.9です。
使用するhtmlファイル
内容は適当です。
one.html
<!DOCTYPE html>
<title>one</title>
************************
two1.html
<!DOCTYPE html>
<title>two1</title>
************************
two2.html
<!DOCTYPE html>
<title>two2</title>
************************
Executeの場合
Templateを明示しなくても良い。
main.go
package main
import (
"html/template"
"log"
"os"
)
func main() {
executeExample()
}
func executeExample() {
tpl := template.Must(template.ParseFiles("one.html"))
// Templateは明示しなくてよい
// 面倒なので標準出力する(本来はサーバーのResonance writerを使用)
err := tpl.Execute(os.Stdout, nil)
if err != nil {
log.Fatalln(err)
}
}
実行結果
<!DOCTYPE html>
<title>one</title>
************************
ExecuteTemplateの場合
Templateを明示する。
main.go
package main
import (
"html/template"
"log"
"os"
)
func main() {
executeTemplateExample()
}
func executeTemplateExample() {
// 複数パースする
tpl := template.Must(template.ParseFiles("htmls/two1.html", "htmls/two2.html"))
// Templateを明示する
err := tpl.ExecuteTemplate(os.Stdout, "two1.html", nil)
if err != nil {
log.Fatalln(err)
}
err = tpl.ExecuteTemplate(os.Stdout, "two2.html", nil)
if err != nil {
log.Fatalln(err)
}
// Executeを使うと最初の一つが出力される
err = tpl.Execute(os.Stdout, nil)
if err != nil {
log.Fatalln(err)
}
}
実行結果
<!DOCTYPE html>
<title>two1</title>
************************
<!DOCTYPE html>
<title>two2</title>
************************
<!DOCTYPE html>
<title>two1</title>
************************
もう一度結論
ExecuteTemplate
だけ使用すれば問題ないと思います。
ちなみに
一度Execute
or ExecuteTemplate
を実行したあとにParseFiles
を行うとエラーを吐きます。
使うTemplateは予めすべてParseFiles
で読み込みましょう。
main.go
package main
import (
"html/template"
"log"
"os"
)
func main() {
executeMultiExample()
}
func executeMultiExample() {
tpl := template.Must(template.ParseFiles("htmls/one.html"))
err := tpl.ExecuteTemplate(os.Stdout,"one.html", nil)
if err != nil {
log.Fatalln(err)
}
tpl, err = tpl.ParseFiles("htmls/two1.html")
if err != nil {
log.Fatalln(err)
}
err = tpl.ExecuteTemplate(os.Stdout, "two1.html", nil)
if err != nil {
log.Fatalln(err)
}
}
実行結果
<!DOCTYPE html>
<title>one</title>
************************
2019/10/06 20:43:30 html/template: cannot Parse after Execute
おわりに
補足等あればコメントして頂けるとありがたいです。