Задать вопрос

Можно в golang написать функцию конструктор или наследовать от другой функции?

Добрый день.
Я пишу роутинг
import "github.com/gorilla/mux"
    func main() {
        router := mux.NewRouter().StrictSlash(true)
        router.HandleFunc("/", Index)  
        router.HandleFunc("/api/:controller/:action", ApiHandler)

и т.д.

И нужно выполнять определённые действия для всех контроллеров (проверку авторизации и т.д.). Можно ли один раз написать функцию с проверкой, а потом ко всем необходимым функциям её прицепить?
Я пока только вижу громоздкий вариант-это запуск функции-проверки во всех функциях. Есть ли вариант конструктора или наследования?
  • Вопрос задан
  • 1861 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@TwoRS Автор вопроса
Среди всего интернета элементарного примера так и не нашёл. Спасибо за подсказки, в каком направлении двигаться.
Вот решение

type logWrapper struct {
        http.Handler
    }

    func (wr logWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s %s\n", r.Method, r.URL, time.Now())
        wr.Handler.ServeHTTP(w, r)
    }    

    func main() {

        router := mux.NewRouter()
        s := http.StripPrefix("/static/", http.FileServer(http.Dir("./files/"))) 
        router.HandleFunc("/", Index)
        router.HandleFunc("/login", LogIn)
        router.HandleFunc("/logout", LogOut)   
            FileHandler := http.HandlerFunc(File) 

        router.Handle("/file.html", logWrapper{FileHandler})
        router.PathPrefix("/static/").Handler(s)
        http.Handle("/", router) 

        http.ListenAndServe(":5000", nil) 
    } 

    func Index(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "hello")
    }

    func File(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "это обрабатывается в обёртке)) ")
    }

....
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
artem_kovardin
@artem_kovardin
Все хендлеры в Go реализуют интерфейс http.Handler и для них можно писать обертки. Вот статья с подробностями "Хендлеры и избавление от глобальных переменных".
Ответ написан
Комментировать
@SilentFl
Откройте для себя middleware, например interpose. Вот пример с авторизацией, все чисто и ваши функции не затрагивает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы