2014-02-24 77 views
2

我讀的書,而我最瞭解,我有以下配置的難度「要走的路。」哪裏包裹HandleFunc從獲得responseWriter和要求?

筆者提到的方式在一個封閉該負責恐慌像這樣包裝一個HandleFunc:

func Index(w http.ResponseWriter, req *http.Request) { 
    w.Header().Set("Content-Type", "text/html") 
    fmt.Fprint(w, "<h2>Index</h2>") 
} 

func logPanics(function HandleFunc) HandleFunc { 
    return func(w http.ResponseWriter, req *http.Request) { 
     defer func() { 
      if err := recover(); err != nil { 
       log.Printf("[%v] caught panic: %v", req.RemoteAddr, err) 
      } 
     }() 
     function(w, req) // Where do w and req come from? 
    } 
} 

後來,這是通過調用:

http.HandleFunc("/", logPanics(Index)) 

我瞭解大部分,但不知道如何使用W和REQ

function(w, req) 

得到它們的值?我是否理解正確,在回覆聲明中的w和req

return func(w http.ResponseWriter, req *http.Request) 

是完全不同的嗎?然後我想知道,w和req如何獲得他們的價值。我希望有人能對我的問題提供一些線索,因爲我真的想了解發生了什麼事情,而不僅僅是複製和粘貼上。

回答

3

當您致電http.HandleFunc(path, function)時,它會導致服務器在收到給定路徑的請求時調用function。該函數的調用與*http.Request描述從客戶端的請求,並且可以被用來寫響應返回給客戶端一http.ResponseWriter

在下面的電話:

http.HandleFunc("/", logPanics(Index)) 

正在註冊的處理函數是logPanics返回的功能。當收到對/的請求時,該函數將被調用。該功能反過來調用您的Index功能並捕捉任何恐慌。

3

難道我理解正確的話,在return語句w和REQ return func(w http.ResponseWriter, req *http.Request) 是完全不同的?

沒有,一點都沒有,這些都是一樣的!一旦你刪除的延遲和 封閉分配給它變得有點更清晰的變量:

func logPanics(function HandleFunc) HandleFunc { 
    f := func(w http.ResponseWriter, req *http.Request) { 
     function(w, req) // Where do w and req come from? 
    } 
    return f 
} 

沒有這個代碼什麼都沒有,但它是很容易看到發生的事情:1)f是一個功能正確的簽名(採用ResponseWriter和Request)。 2)它所做的就是調用傳遞給logPanics它被稱爲參數的函數。 3)返回此功能f