Http 如何检查是否已写入ResponseWriter

Http 如何检查是否已写入ResponseWriter,http,go,httpresponse,Http,Go,Httpresponse,使用Golang的软件包,如何检查ResponseWriter是否已写入?我收到以下错误消息: http:multiple response.WriteHeader调用 当然,我可以从我的函数中返回布尔值之类的值,指示我是否使用重定向或我尝试过的其他方法写入了ResponseWriter,但我肯定能够在使用简单的方法写入之前检查ResponseWriter是否已写入 我正在寻找一个类似以下的函数,我可以在写入ResponseWriter之前使用它: if w.Header().Get("Stat

使用Golang的软件包,如何检查
ResponseWriter
是否已写入?我收到以下错误消息:

http:multiple response.WriteHeader调用

当然,我可以从我的函数中返回布尔值之类的值,指示我是否使用重定向或我尝试过的其他方法写入了
ResponseWriter
,但我肯定能够在使用简单的方法写入之前检查
ResponseWriter
是否已写入

我正在寻找一个类似以下的函数,我可以在写入
ResponseWriter
之前使用它:

if w.Header().Get("Status-Code") == "" {
    http.Redirect(w, r, "/", http.StatusSeeOther)
} else {
    fmt.Println("Response Writer has already been written to.")
}
type doneWriter struct {
    http.ResponseWriter
    done bool
}

func (w *doneWriter) WriteHeader(status int) {
    w.done = true
    w.ResponseWriter.WriteHeader(status)
}

func (w *doneWriter) Write(b []byte) (int, error) {
    w.done = true
    return w.ResponseWriter.Write(b)
}

func myMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        dw := &doneWriter{ResponseWriter: w}
        next.ServeHTTP(dw, r)
        if dw.done {
            // Something already wrote a response
            return
        }
        // Nothing else wrote a response
        w.WriteHeader(http.StatusOK)
        // Whatever you want here
    }
}

上面的代码似乎不起作用。。。有人知道如何检查
ResponseWriter
是否已写入吗?

唯一的方法是使用
http的自定义实现。ResponseWriter

if w.Header().Get("Status-Code") == "" {
    http.Redirect(w, r, "/", http.StatusSeeOther)
} else {
    fmt.Println("Response Writer has already been written to.")
}
type doneWriter struct {
    http.ResponseWriter
    done bool
}

func (w *doneWriter) WriteHeader(status int) {
    w.done = true
    w.ResponseWriter.WriteHeader(status)
}

func (w *doneWriter) Write(b []byte) (int, error) {
    w.done = true
    return w.ResponseWriter.Write(b)
}

func myMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        dw := &doneWriter{ResponseWriter: w}
        next.ServeHTTP(dw, r)
        if dw.done {
            // Something already wrote a response
            return
        }
        // Nothing else wrote a response
        w.WriteHeader(http.StatusOK)
        // Whatever you want here
    }
}

我也一起为我处理这件事。如果您愿意,也可以随意使用。

我找到了一个可能的解决方案。每次我使用重定向或文件服务器写入ResponseWriter时,我还可以设置一个自定义头
w.header().set(“custom”,“1”)
指示它已被设置,并且我可以检查
w.header().Get(“custom”)=“1”
您可以制作自己版本的
http.ResponseWriter
,在调用
WriteHeader
时将bool设置为true。看,看一看。它在ResponseWriterSee的示例实现上实现了一个
Write()
方法。的可能重复