为什么 http.ResponseWriter 不实现响应流 End() 调用?

在 Node.js 中,为了完成对流的写入(理论上使用 HTTP,告诉客户端没有更多数据),我们使用response.end(). 使用 Go,ResponseWriter 接口类似于:


type ResponseWriter interface {

    Header() Header

    Write([]byte) (int, error)

    WriteHeader(statusCode int)

}

所以我的问题是双重的:

  1. 我们如何从 ResponseWriter 中获取 HTTP 状态码?

  2. 更重要的是: Go(以及像 Mux 这样的路由器)如何知道程序员何时完成对 ResponseWriter 的写入?是goroutine结束的时候吗?如果你想在 goroutine 堆栈为空之前完成响应怎么办?在 ResponseWriter 接口中没有 End() 方法似乎是一个实现缺陷。


www说
浏览 188回答 1
1回答

慕工程0101907

http.ResponseWriter这在标准实现中是不可能的。但这是一个接口,所以很容易编写自己的记录状态的实现。一个简单实现的开始可能是:type statusRecorder struct {    http.ResponseWriter    status int}func (r *statusRecorder) WriteHeader(status int) {    r.status = status    r.ResponseWriter.WriteHeader(status)}虽然这看起来像是 API 的限制,但实际上恰恰相反。通过使用接口,可以创建一个执行任何操作或记录您想要的任何信息的实现,而不是局限于标准库作者可能决定公开的任何功能。当处理程序返回时,它就完成了。如果您希望在发送响应后做额外的工作,您可以生成一个 goroutine 以在主处理程序返回后继续操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go