package main
import (
"fmt"
"io"
"html/template"
"net/http"
"log"
)
type pageFunc func() (string, interface{})
func thread() (string, interface{}) {
return "thread", nil
}
func main() {
t := template.New("main")
t.ParseGlob("templates/*.xhtml")
respond := func(f pageFunc) http.HandlerFunc {
fmt.Println("respond 1")
return func(w http.ResponseWriter, r *http.Request) {
fmt.Println("respond 2")
name, data := f()
t.ExecuteTemplate(w, name, data)
}
}
http.HandleFunc("/", respond(thread))
err := http.ListenAndServe(":7842", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上記のプログラムを開始し、単一のリクエストを送信するhttp://localhost:7842/
と、コンソールに次の出力が表示されます。
respond 1
respond 2
respond 2
respond 2
コメントアウトした場合、ハンドラーを1回だけ呼び出すように見えます。
name, data := f()
t.ExecuteTemplate(w, name, data)
その場合、私は次のようになります。
respond 1
respond 2
これは完全に私の理解を超えています。t.ExecuteTemplateを呼び出すと、呼び出された関数が複数回実行されるようになりますか?さらに奇妙なのは(少なくとも私にとっては)、パスを少し変更すると、次のようになります。
http.HandleFunc("/a", respond(thread))
...テンプレート関数のコメントが解除されている場合でも、ハンドラー関数を1回だけ起動します。何が起こっている?
問題のテンプレート(誰かが興味を持っている場合):
{{ define "thread" }}<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test thread page</title>
<link rel="stylesheet" type="text/css" href="/static/board.css" />
<script type="text/javascript" src="/static/general.js"></script>
</head>
<body>
<h1>hello, world.</h1>
</body>
</html>
{{ end }}