2014-03-03 119 views
9

假設我有一箇中心方法,它向http.ResponseWriter添加一個特定的頭文件。我不想使用HandleFunc包裝。通過值或引用傳遞http.ResponseWriter?

我想知道,我是否會通過引用發送ResponseWriter。那麼,什麼是正確的:

addHeaders(&w) 

addHeaders(w) 

問不同:

func addHeaders(w *http.ResponseWriter) {...} 

func addHeaders(w http.ResponseWriter) {...} 

從我的理解,我想說的第一版本會是正確的,因爲我不'不想創建ResponseWriter的副本。但我還沒有看到任何代碼,其中ResponseWriter通過引用傳遞,並想知道爲什麼。

謝謝!

回答

14

http.ResponseWriter是一個接口。你想傳遞它的值,因爲它內部包含一個指向實際Writer的指針。你幾乎不需要指向接口的指針。

看一個標準的處理程序FUNC的簽名是什麼:

func(http.ResponseWriter, *http.Request) 

注意ResponseWriter不是指針。

+3

只要說清楚:Go中沒有「引用」的傳遞。 Go完全沒有「通過參考」的概念。所有人都可以做的就是按價值傳遞一個指針。 (幾乎)接口的所有用途都不會使用指向接口的指針。 – Volker

+4

注意「-er」類型名稱(Reader(At),Writer,Stringer,Locker)或描述抽象概念的類型名稱(crypto.Hash)通常是接口和參考,以幫助在將來發現這一點。當然,文檔有最後一個字。 – twotwotwo