Golang的http.ResponseWriters地图

时间:2015-04-16 03:14:52

标签: go

我正在尝试创建一个存储http.ResponseWriters的映射,以便稍后我可以在单独的线程完成相关计算后写入它们。 地图在我的主要内容中定义如下:
jobs := make(map[uint32]http.ResponseWriter)
然后我将此映射传递给句柄函数,如下所示:

r.HandleFunc("/api/{type}/{arg1}", func(w http.ResponseWriter, r *http.Request) {
    typ, _ := strconv.Atoi(mux.Vars(r)["type"])
    AddReqQueue(w, ReqQueue, typ, mux.Vars(r)["arg1"], jobs, ids)
}).Methods("get")

之后我处理reuqeuest并将其添加到频道:

func AddReqQueue(w http.ResponseWriter, ReqQueue chan mssg.WorkReq, typ int, arg1 string, jobs map[uint32]http.ResponseWriter, ids []uint32) {
    var id uint32
    id, ids = ids[0], ids[1:] // get a free work id
    jobs[id] = w
    fmt.Println("Adding req to queue")
    ReqQueue <- mssg.WorkReq{Type: uint8(typ), Arg1: arg1, WId: id}
}

在这个函数中,我已经测试过并且能够将数据写入ReponseWriter,但是稍后当我尝试使用地图时:

func SendResp(RespQueue chan mssg.WorkResp, jobs map[uint32]http.ResponseWriter) {
for {
    resp := <-RespQueue
    jobs[resp.WId].Header().Set("Content-Type", "text/plain")
    _, err := jobs[resp.WId].Write(resp.Data) // ERROR IS COMING FROM HERE
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
    }
}

}

它不起作用。无论我预先设置标题还是尝试写(即使只是一个简单的字符串我硬编码)我得到的错误

Conn.Write wrote more than the declared Content-Length

我知道我正在访问地图中正确的结构,看起来好像ReponseWriter已经脱离了上下文或已经损坏,我也知道标题不应该真正重要,因为它是我第一次打电话给Write()因此它应该为我创建标题。

1 个答案:

答案 0 :(得分:1)

@elithrar是对的。在处理程序退出后,我不知道http.ResponseWriter对象变为无效。如果我只是强迫我的处理程序等待,它就可以正常工作。