谁给 http.ResponseWriter 写信?

Cod*_*der 2 go

我无法理解ResponseWriter语法的一部分。

type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}
Run Code Online (Sandbox Code Playgroud)

例如,在go by example 提供的示例中,该area方法由两个实现geometry接口的对象实现。

http.ResponseWriter是一个接口,其能够Write,除其他事项。

我写了以下内容来测试 w ResponseWriter

func sendData(w http.ResponseWriter, r *http.Request) {
    fmt.Println(w)
}

func main() {
    http.HandleFunc("/", sendData)
    http.ListenAndServe(":8081", nil)
}
Run Code Online (Sandbox Code Playgroud)

浏览器返回结果为空

在执行代码的终端中,我获得了以下标准输出:

&{0xc00009ebe0 0xc0000e8100 {} 0x112a550 false false false false 0xc00006c500 {0xc0000d40e0 map[] false false} map[] false 0 -1 0 false false [] 0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0] 0xc0000200e0 0}
Run Code Online (Sandbox Code Playgroud)

作为一个接口,它依赖于底层类型来进行实际的写入,但是底层类型是什么,写入在哪里实现?

icz*_*cza 5

fmt.Println(w)不写入w. 它写入w标准输出。由于没有人写入w,一个空的响应文档将被发送回 HTTP 客户端。

为了编写 w,调用它的Write()方法是这样的:

w.Write([]byte("hello"))
Run Code Online (Sandbox Code Playgroud)

然后您将看到hello响应文档。

请注意,有一个fmt.Fprintln()变体,你可以告诉在那里。所以你可以通过w作为写作的目的地:

fmt.Fprintln(w, "hello")
Run Code Online (Sandbox Code Playgroud)

然后你会看到一个hello响应文件。

要获取实现的具体类型,请http.ResponseWriter像这样打印类型:

fmt.Printf("%T\n", w)
Run Code Online (Sandbox Code Playgroud)

然后你会看到这样的输出:

*http.response
Run Code Online (Sandbox Code Playgroud)

因此,传递给您并实现http.ResponseWriter的类型是未导出的类型http.response(更具体地说是指向它的指针)。它未导出,因此您无法“触摸”它,但出于教育目的,它在 中定义net/http/server.go,目前位于 #418 行

有关更多选项和更深入的见解,请参阅相关问题:ResponseWriter.Write 和 io.WriteString 之间有什么区别?

  • 哇谢谢!你的回答确实启发了我并帮助我更多地了解 Go。 (3认同)