2013-01-05 39 views
0
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 }} 
+0

您的模板中有什麼東西會導致您的瀏覽器對「/」進行多重查找?你能發佈一個展示行爲的最小模板嗎? –

+0

我應該記下它,但是因爲沒有太多有趣的內容,所以我放棄了模板。它現在在那裏。 – cikkle

回答

3

。例如。一些瀏覽器可能會要求提供網站圖標。如果你想保證一個請求,那麼我會建議爲此寫一個簡單的工具。

+0

沒關係。我只是用捲曲測試它,你是對的。只有一個迴應。謝謝。多麼愚蠢的問題。 – cikkle