我正在尝试创建一个存储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()
因此它应该为我创建标题。
答案 0 :(得分:1)
@elithrar是对的。在处理程序退出后,我不知道http.ResponseWriter对象变为无效。如果我只是强迫我的处理程序等待,它就可以正常工作。