我正在嘗試為多個處理程序設置一個 http 標頭。我的第一個想法是制作一個自定義寫入函數(shù),該函數(shù)將在編寫響應之前設置標題,如底部的代碼示例。但是,當我傳遞一個指向 http.ResponseWriter 的指針并嘗試從我的函數(shù)訪問它時,它告訴我“類型 *http.ResponseWriter 沒有 Header 方法”。為多個處理程序設置標頭的最佳方法是什么,以及為什么指針不能按我希望的方式工作?func HelloServer(w http.ResponseWriter, req *http.Request) { type Message struct { Name string Body string Time int64 } m := Message{"Alice", "Hello", 1294706395881547000} b, _ := json.Marshal(m) WriteJSON(&w, b)}func WriteJSON(wr *http.ResponseWriter, rawJSON []byte) { *wr.Header().Set("Content-Type", "application/json") io.WriteString(*wr, string(rawJSON))}func main() { http.HandleFunc("/json", HelloServer) err := http.ListenAndServe(":9000", nil) if err != nil { log.Fatal("ListenAndServer: ", err) }}
3 回答

jeck貓
TA貢獻1909條經(jīng)驗 獲得超7個贊
我不確定多處理程序的事情,但我知道為什么你寫的代碼失敗了。關(guān)鍵是這一行:
*wr.Header().Set("Content-Type", "application/json")
由于運算符優(yōu)先級,被解釋為:
*(wr.Header().Set("Content-Type", "application/json"))
由于wr
有型*http.ResponseWriter
,這是一個指針,以和接口,而不是接口本身,這是不行的。我假設您知道這一點,這就是您這樣做的原因*wr
。我假設您要向編譯器暗示的是:
(*wr).Header().Set("Content-Type", "application/json")
如果我沒記錯的話,那應該可以編譯并正常運行。

楊__羊羊
TA貢獻1943條經(jīng)驗 獲得超7個贊
您不需要使用,*wr
因為它已經(jīng)引用了一個指針。
wr.Header().Set("Content-Type", "application/json")
應該足夠了。
如果你想為每個請求設置“全局”標頭,你可以創(chuàng)建一個滿足的函數(shù)http.HandleFunc
(go.auth 有一個很好的例子),然后像這樣包裝你的處理程序:
http.HandleFunc("/hello", Defaults(helloHandler))
另請查看net/http
文檔,其中包含更多示例。
- 3 回答
- 0 關(guān)注
- 247 瀏覽
添加回答
舉報
0/150
提交
取消