【问题标题】:Who writes to http.ResponseWriter?谁写信给 http.ResponseWriter?
【发布时间】:2021-06-20 23:47:25
【问题描述】:

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

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

例如,在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)
}

浏览器返回结果为空白

在执行代码的终端,我得到了如下stdout:

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

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

【问题讨论】:

  • 两个非常好的提示:1) 重做所有语言基础知识的 Go 之旅。 2) 总是,我的意思是总是阅读你使用的所有函数和包的文档,这里是 fmt.Println。除非您可能习惯于 Go 文档的文档很短,否则很有帮助。

标签: go


【解决方案1】:

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?

【讨论】:

  • 哇,谢谢!你的回答真的启发了我,帮助我更多地了解围棋。 ??
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 2021-10-12
  • 2022-01-25
  • 2016-08-07
  • 2010-11-14
  • 2021-06-06
  • 2015-03-15
  • 2017-02-02
相关资源
最近更新 更多