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/と、コンソールに次の出力が表示されます。

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 }}
4

1 に答える 1

3

「単一のリクエスト」がブラウザによって行われた場合、実際には複数のリクエストである可能性があります。例えば。一部のブラウザは、サイトのファビコンを要求する場合があります。保証された単一のリクエストが必要な場合は、その目的のための簡単なツールを作成することをお勧めします。

于 2013-01-05T08:02:29.760 に答える