Кажется, это переменная замыкания в цикле проблемы. Вы создаете функцию, которая захватывает next
в каждом цикле, но это будет означать, что все функции имеют общую переменную next
, и все они будут иметь значение, оставленное в последнем цикле. Я думаю, что вы можете это исправить, введя новую временную переменную внутри области видимости цикла:
func createChain(collection []MiddlewareInterface, handler http.Handler) http.Handler
next := handler
for _, middlew := range collection {
thisNext:= next
mw := middlew
next = func(w http.ResponseWriter, res *http.Request) {
mw.Run(w, res, thisNext)
}
}
return next
}
Возможно, размещение нового определения переменной не совсем правильно, но проблема закрытия определенно станет источником вашей проблемы. Обычно обработчики промежуточного программного обеспечения http работают не так, как обычно, оборачивая друг друга, а не цепями.