Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t http.ResponseWriter是否实现响应流End()调用?_Http_Go - Fatal编程技术网

为什么';t http.ResponseWriter是否实现响应流End()调用?

为什么';t http.ResponseWriter是否实现响应流End()调用?,http,go,Http,Go,在Node.js中,为了完成对流的写入(理论上是HTTP,告诉客户端没有更多数据),我们使用response.end()。使用Go,ResponseWriter界面如下所示: type ResponseWriter interface { Header() Header Write([]byte) (int, error) WriteHeader(statusCode int) } 所以我的问题有两个: 如何从ResponseWriter获取HTTP状态代码 更重要的是

在Node.js中,为了完成对流的写入(理论上是HTTP,告诉客户端没有更多数据),我们使用
response.end()
。使用Go,ResponseWriter界面如下所示:

type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}
所以我的问题有两个:

  • 如何从ResponseWriter获取HTTP状态代码

  • 更重要的是:Go(以及Mux等路由器)如何知道程序员何时完成了对响应编写器的写入?是在狂欢节结束的时候吗?如果您想在goroutine堆栈为空之前完成响应,该怎么办?在ResponseWriter接口中没有End()方法似乎是一个实现缺陷
  • 这在标准的
    http.ResponseWriter
    实现中是不可能的。但这是一个接口,因此很容易编写自己的实现来记录状态。简单实现的开始可能是:

    type statusRecorder struct {
        http.ResponseWriter
        status int
    }
    
    func (r *statusRecorder) WriteHeader(status int) {
        r.status = status
        r.ResponseWriter.WriteHeader(status)
    }
    
    虽然这似乎是API的一个限制,但实际上恰恰相反。通过使用接口,可以创建执行任何操作或记录任何所需信息的实现,而不限于标准库作者决定公开的任何功能

  • 当处理程序返回时,它就完成了。如果您希望在发送响应后执行其他工作,则可以生成goroutine,以便在主处理程序返回后继续操作


  • 2) 当处理程序返回时就完成了。关于1,你能澄清一下你的意思吗?您将状态代码写入写入写入程序,为什么要在处理程序中尝试从它获取状态?1)无法从响应写入程序获取状态代码,但应用程序可以记录应用程序设置的值2)处理程序函数返回到net/http服务器时请求完成。“如果您想在goroutine堆栈为空之前完成响应,该怎么办?”--我不明白您在这里的意思。您能详细说明一下吗?当然可以。事实上,您必须这样做。这是唯一的选择。是的,goroutine是发送响应后执行工作的一种常见方式。如前所述,“状态代码问题”这根本不是问题。如果尚未设置状态,您还需要实现写入并将状态设置为200。@ILoverReflection:是,或者在状态为0时推断为200。这就是为什么我说这只是实现的开始。