9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ExecuteとExecuteTemplateはどっちを使えば良いのか (goのhttp/template)

Last updated at Posted at 2019-10-06

まず結論

違いは使用する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

おわりに

補足等あればコメントして頂けるとありがたいです。

9
2
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
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?