Рекурсия при перезаписи в переменную - PullRequest
0 голосов
/ 25 апреля 2018

Я надеюсь, что вы можете помочь мне, так как это доставило мне немало головной боли.

Я создаю цепочку для промежуточного программного обеспечения, которая выполняется позже.Но похоже, что это стало повторяться.Переменная next внутри анонимной функции указывает на себя.

type MiddlewareInterface interface {
    // Run the middleware for the given request, and receive the next handler.
    Run(http.ResponseWriter, *http.Request, http.Handler)
}

createChain(collection []MiddlewareInterface, handler http.Handler) http.Handler
    next := handler

    for _, middlew := range collection {
        next = func(w http.ResponseWriter, res *http.Request) {
            middlew.Run(w, res, next)
        }
    }

    return next
}

Я знаю, что это своего рода вопрос нуба, но я искренне хочу понять, что вызывает это и как это можно решить.Ждем ваших ответов!

1 Ответ

0 голосов
/ 25 апреля 2018

Кажется, это переменная замыкания в цикле проблемы. Вы создаете функцию, которая захватывает 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 работают не так, как обычно, оборачивая друг друга, а не цепями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...