HUWWW
第一:这里没有理由使用反射。与您的问题无关,但不需要。在您的 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.")}