gpt4 book ai didi

go - 谁写入 http.ResponseWriter?

转载 作者:行者123 更新时间:2023-12-02 16:15:39 27 4
gpt4 key购买 nike

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

type ResponseWriter interface {
Header() Header
Write([]byte) (int, error)
WriteHeader(statusCode int)
}

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

http.ResponseWriter 是一个接口(interface),能够进行Write 等操作。

我编写了以下代码来测试 w ResponseWriter

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

func main() {
http.HandleFunc("/", sendData)
http.ListenAndServe(":8081", nil)
}

浏览器返回结果为空白

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

&{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}

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

最佳答案

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

要将写入 w,调用它的Write() 方法如下:

w.Write([]byte("hello"))

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

请注意,有一个 fmt.Fprintln()您可以告诉在哪里写入的变体。所以你可以传递 w 作为写入的目的地:

fmt.Fprintln(w, "hello")

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

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

fmt.Printf("%T\n", w)

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

*http.response

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

有关更多选项和更深入的见解,请参阅相关问题:What's the difference between ResponseWriter.Write and io.WriteString?

关于go - 谁写入 http.ResponseWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66778125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com