Должен ли я использовать ServeMux или http непосредственно в golang?

Мне было интересно, должен ли я создать новый ServeMux и зарегистрировать его в http.Server или я должен напрямую вызывать http.HandleFunc и http.Handler?

Я думаю, что маршрут с ServeMux лучше, потому что http.HandleFunc явно нарушает глобальное состояние HTTP-пакета, что считается плохой практикой в ​​Go. Однако во многих учебниках, даже официальных, я часто вижу использование маршрута http.HandleFunc.

Это заставляет меня задаться вопросом: почему нужно использовать http.HandleFunc, когда есть ServeMux? Я знаю, что у ServeMux есть некоторые преимущества (например, вы можете вложить его, не повторяя префикс все время), но мне интересно, почему я должен выбирать http.HandleFunc вместо мультиплексора, тем более что HandleFunc использует ServeMux внутри.

Изменить: как и было обещано в комментариях, я попросил отказаться от дополнительных (и бесполезных функций IMO) на Golang-dev, и они сказали "нет" (ну, человек сказал "нет"). Вот ссылка.


person Matt3o12    schedule 27.03.2016    source источник
comment
(Я также хотел сказать, что это хороший вопрос и полезный для других в будущем, поскольку он возникал раньше)   -  person elithrar    schedule 27.03.2016
comment
elithrar: вот почему я спросил об этом здесь. Я ничего не нашел в Google. Imo, тогда http.HandleFunc и http.Handle должны быть объявлены устаревшими. Использование Mux и Server добавляет еще 2 строки, а двусмысленность всегда плоха, особенно если более очевидный путь — плохой.   -  person Matt3o12    schedule 27.03.2016
comment
Обещание совместимости с Go1 не позволяет удалить их, поэтому мы «застряли» с ними до версии 2.0 (до которой еще далеко — годы).   -  person elithrar    schedule 27.03.2016
comment
elithrar: я не могу найти ничего об устаревании в обещании совместимости. Он по-прежнему будет доступен и будет работать так же, как и сейчас (по крайней мере, до версии 2.0), но новички будут держаться от него подальше.   -  person Matt3o12    schedule 27.03.2016
comment
Единственный способ отказаться от поддержки — это примечание к документации. В Go нет концепции предупреждений (от компилятора), поэтому эффективность будет минимальной. Вы можете предложить добавить документацию к этим методам на golang-dev.   -  person elithrar    schedule 27.03.2016
comment
Я сделаю! Я думаю, что сделать примечание к документации было бы очень полезно! Первое, что я сделал, когда заметил, что есть два метода, — снова прочитал документацию.   -  person Matt3o12    schedule 27.03.2016


Ответы (1)


Вы на правильном пути: вам следует создать свой собственный ServeMux по причинам, которые вы изложили.

Использование DefaultServeMux также сопряжено с риском раскрытия конечных точек профилирования при использовании net/http/pprof, поскольку они присоединены к DefaultServeMux.

http.Handle|HandleFunc являются удобными методами и, возможно, полезны для сохранения шаблонного кода в примере, но создание ServeMux дает вам возможность обернуть его, вложить в другой, экспортировать из конструктора и т. д.

person elithrar    schedule 27.03.2016