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/
使控制檯輸出:http.HandleFunc調用根處理每個請求3次
respond 1
respond 2
respond 2
respond 2
它僅出現調用處理程序的單個時間如果我註釋掉:
name, data := f()
t.ExecuteTemplate(w, name, data)
在這種情況下,我只得到:
respond 1
respond 2
這完全超出了我的理解。如何調用t.ExecuteTemplate使其被調用的函數多次運行?更爲離奇的(對我來說,至少)是,如果我改變路徑咯,像這樣,
http.HandleFunc("/a", respond(thread))
...它再次觸發僅處理函數一次,即使有模板功能註釋。發生什麼事?
有問題的模板,如果感興趣的人:如果「單個請求」是由瀏覽器發出那麼它實際上可能比一個請求更多
{{ 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 }}
您的模板中有什麼東西會導致您的瀏覽器對「/」進行多重查找?你能發佈一個展示行爲的最小模板嗎? –
我應該記下它,但是因爲沒有太多有趣的內容,所以我放棄了模板。它現在在那裏。 – cikkle