Функция http.ListenAndServe
Функция http.ListenAndServe запускает HTTP-сервер,
который прослушивает входящие запросы на указанном адресе
и порту. В первый параметр функция принимает строку
с адресом и портом в формате "host:port",
во второй параметр — обработчик запросов,
реализующий интерфейс http.Handler.
Если адрес не указан, используется ":80".
Синтаксис
err := http.ListenAndServe(addr string, handler http.Handler) error
Пример простого сервера
Запустим сервер, который обрабатывает все запросы одним обработчиком:
package 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)
}
}
Результат выполнения кода:
// при запросе http://localhost:8080/
"Hello, World!"
Пример с пользовательским обработчиком
Передадим в функцию собственный обработчик,
реализующий интерфейс http.Handler:
package 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)
}
}
Результат выполнения кода:
// при запросе http://localhost:8080/
"Custom handler response"
Пример обработки разных маршрутов
Используем http.ServeMux для обработки
разных путей:
package 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)
}
}
Результат выполнения кода:
// при запросе http://localhost:8080/
"Home page"
// при запросе http://localhost:8080/about
"About page"
Пример с обработкой ошибок
Функция возвращает ошибку, если сервер не удалось запустить. Обработаем возможные ошибки:
package 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)
}
}
Результат выполнения кода:
// при успешном запуске
"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,
которая используется для маршрутизации запросов