为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
www说 2022-05-23 16:40:05
在 Node.js 中,为了完成对流的写入(理论上使用 HTTP,告诉客户端没有更多数据),我们使用response.end(). 使用 Go,ResponseWriter 接口类似于:type ResponseWriter interface {    Header() Header    Write([]byte) (int, error)    WriteHeader(statusCode int)}所以我的问题是双重的:我们如何从 ResponseWriter 中获取 HTTP 状态码?更重要的是: Go(以及像 Mux 这样的路由器)如何知道程序员何时完成对 ResponseWriter 的写入?是goroutine结束的时候吗?如果你想在 goroutine 堆栈为空之前完成响应怎么办?在 ResponseWriter 接口中没有 End() 方法似乎是一个实现缺陷。
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

http.ResponseWriter这在标准实现中是不可能的。但这是一个接口,所以很容易编写自己的记录状态的实现。一个简单实现的开始可能是:


type statusRecorder struct {

    http.ResponseWriter

    status int

}


func (r *statusRecorder) WriteHeader(status int) {

    r.status = status

    r.ResponseWriter.WriteHeader(status)

}

虽然这看起来像是 API 的限制,但实际上恰恰相反。通过使用接口,可以创建一个执行任何操作或记录您想要的任何信息的实现,而不是局限于标准库作者可能决定公开的任何功能。


当处理程序返回时,它就完成了。如果您希望在发送响应后做额外的工作,您可以生成一个 goroutine 以在主处理程序返回后继续操作。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号