1 回答

TA貢獻1874條經(jīng)驗 獲得超12個贊
第一:這里沒有理由使用反射。與您的問題無關(guān),但不需要。
在您的 Context 設置中,您使用的是 ctx 的全局變量。
go 的 http 服務器是并發(fā)的,所以你正在做的是讓多個 goroutine 更新同一個全局變量,然后將它傳遞給處理程序。
這會導致您的處理程序有時會獲得相同的 ResponseWriter 實例并嘗試對其進行寫入。這可能會導致ab失敗,因為您通過混合在線上發(fā)送的內(nèi)容來編寫無效的 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 關(guān)注
- 191 瀏覽
添加回答
舉報