我无法理解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)
作为一个接口,它依赖于底层类型来进行实际的写入,但是底层类型是什么,写入在哪里实现?
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 之间有什么区别?
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |