HTTP сервер: net/http, middleware, роутинг

К вопросам
Средний
Web Development

Вопрос

Как создать HTTP сервер в Go? Что такое middleware и как его реализовать? Какие есть популярные роутеры?

Ответ

Стандартный net/http: - http.HandleFunc для простых случаев - http.Handler интерфейс для сложной логики - ServeMux для роутинга - Middleware как функции высшего порядка Популярные роутеры: - Gorilla Mux - более гибкий роутинг - Gin - быстрый веб-фреймворк - Echo - минималистичный фреймворк

// Middleware
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    mux := http.NewServeMux()
    
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })
    
    // Применение middleware
    handler := loggingMiddleware(mux)
    
    log.Fatal(http.ListenAndServe(":8080", handler))
}
// Middleware
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    mux := http.NewServeMux()
    
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })
    
    // Применение middleware
    handler := loggingMiddleware(mux)
    
    log.Fatal(http.ListenAndServe(":8080", handler))
}

Дополнительные вопросы

Как реализовать graceful shutdown? Что такое http.Server и зачем он нужен?