Функция http.ListenAndServe

Функция http.ListenAndServe запускает HTTP-сервер, который прослушивает входящие запросы на указанном адресе и порту. В первый параметр функция принимает строку с адресом и портом в формате "host:port", во второй параметр — обработчик запросов, реализующий интерфейс http.Handler. Если адрес не указан, используется ":80".

Синтаксис

goerr := http.ListenAndServe(addr string, handler http.Handler) error

Пример простого сервера

Запустим сервер, который обрабатывает все запросы одним обработчиком:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
  })

  err := http.ListenAndServe(":8080", nil)
  if err != nil {
    fmt.Println("Server error:", err)
  }
}

Результат выполнения кода:

go// при запросе http://localhost:8080/
"Hello, World!"

Пример с пользовательским обработчиком

Передадим в функцию собственный обработчик, реализующий интерфейс http.Handler:

gopackage main

import (
  "fmt"
  "net/http"
)

type MyHandler struct{}

func (h MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Custom handler response")
}

func main() {
  handler := MyHandler{}
  err := http.ListenAndServe(":8080", handler)
  if err != nil {
    fmt.Println("Server error:", err)
  }
}

Результат выполнения кода:

go// при запросе http://localhost:8080/
"Custom handler response"

Пример обработки разных маршрутов

Используем http.ServeMux для обработки разных путей:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  mux := http.NewServeMux()

  mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Home page")
  })

  mux.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "About page")
  })

  err := http.ListenAndServe(":8080", mux)
  if err != nil {
    fmt.Println("Server error:", err)
  }
}

Результат выполнения кода:

go// при запросе http://localhost:8080/
"Home page"
// при запросе http://localhost:8080/about
"About page"

Пример с обработкой ошибок

Функция возвращает ошибку, если сервер не удалось запустить. Обработаем возможные ошибки:

gopackage main

import (
  "fmt"
  "log"
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Server is running")
  })

  log.Println("Starting server on port 8080...")
  err := http.ListenAndServe(":8080", nil)
  if err != nil {
    log.Fatalf("Failed to start server: %v", err)
  }
}

Результат выполнения кода:

go// при успешном запуске
"2024/01/01 12:00:00 Starting server on port 8080..."
// при ошибке (например, порт уже занят)
"2024/01/01 12:00:00 Failed to start server: listen tcp :8080: bind: address already in use"

Смотрите также

  • функцию http.ListenAndServeTLS,
    которая запускает HTTPS-сервер с TLS-шифрованием
  • функцию Server.ListenAndServe,
    которая запускает сервер с более гибкими настройками
  • функцию http.HandleFunc,
    которая регистрирует обработчик для указанного маршрута
  • функцию http.ServeMux,
    которая используется для маршрутизации запросов