1 回答
TA贡献1874条经验 获得超12个赞
第一:这里没有理由使用反射。与您的问题无关,但不需要。
在您的 Context 设置中,您使用的是 ctx 的全局变量。
go 的 http 服务器是并发的,所以你正在做的是让多个 goroutine 更新同一个全局变量,然后将它传递给处理程序。
这会导致您的处理程序有时会获得相同的 ResponseWriter 实例并尝试对其进行写入。这可能会导致ab失败,因为您通过混合在线上发送的内容来编写无效的 http 响应。
摆脱全局 ctx 变量并使用本地变量,如下所示:
func handler(rw http.ResponseWriter, r *http.Request) {
ctx := &Context{ // notice that this is a local var now
names:make([]string, 0),
rw:rw,
r:r,
}
for i := 0; i < len(middlewareInfos); i++ {
middleware := reflect.New(middlewareInfos[i].t)
setContextMethod := middleware.MethodByName("SetContext")
setContextMethod.Call([]reflect.Value{reflect.ValueOf(ctx)})
handleMethod := middleware.MethodByName("Handle")
values := handleMethod.Call([]reflect.Value{})
if value, ok := values[0].Interface().(bool); !ok || !value {
return
}
}
// fmt.Printf("%v\n", ctx)
fmt.Fprint(rw, "Hello World.")
}
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报