通过值或引用传递http.ResponseWriter?

Ral*_*alf 12 go

假设我有一个中心方法,它为http.ResponseWriter添加一个特定的头.我不想使用HandleFunc包装器.

我想知道,我是否通过引用发送ResponseWriter.那么,什么是正确的:

addHeaders(&w)
Run Code Online (Sandbox Code Playgroud)

要么

addHeaders(w)
Run Code Online (Sandbox Code Playgroud)

问的不同:

func addHeaders(w *http.ResponseWriter) {...}
Run Code Online (Sandbox Code Playgroud)

要么

func addHeaders(w http.ResponseWriter) {...}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我会说第一个版本是正确的,因为我不想创建ResponseWriter的副本.但我还没有看到任何代码,其中ResponseWriter通过引用传递,并想知道为什么.

谢谢!

Jim*_*imB 18

http.ResponseWriter是一个界面.您希望传递其值,因为它在内部包含指向实际Writer的指针.你几乎不想要一个指向接口的指针.

看看标准处理程序func的签名是什么:

func(http.ResponseWriter, *http.Request)
Run Code Online (Sandbox Code Playgroud)

请注意,ResponseWriter不是指针.

  • 只是说清楚:Go中没有"参考"传递.Go完全没有"通过引用"的概念.所有人都可以通过值传递指针.并且(几乎)所有使用的接口都不*使用指针接口. (4认同)
  • 注意"-er"类型名称(Reader(At),Writer,Stringer,Locker)或描述抽象概念的类型名称(crypto.Hash)通常是接口,因此引用,以帮助在将来发现它.当然,文档最后都有. (4认同)