Создайте базовый веб‑сервер на Go за несколько минут: импортируйте net/http, реализуйте обработчик типа http.HandlerFunc и запустите сервер на порту 8080. В статье есть готовый код, инструкция по запуску, проверки и рекомендации по безопасности для продакшна.

Go — современный язык программирования, удобный для разработки как веб‑приложений, так и системного ПО. Он быстро завоевал популярность и используется в проектах типа Docker, Kubernetes и Terraform. Встроенная стандартная библиотека делает Go отличным выбором для простых и надёжных веб‑серверов.
Ниже — пошаговое руководство по созданию минимального веб‑сервера с объяснением кода, проверками и советами по улучшению для продакшна.
Необходимые пакеты
Пакет net/http предоставляет всё необходимое для создания веб‑серверов и клиентов HTTP в Go. Дополнительно мы используем fmt для форматирования строк и log для логирования ошибок.
Импортировать пакеты можно двумя способами — по отдельности или группой. Пример группового импорта:
package main
import (
"fmt"
"log"
"net/http"
)Определения в одну строку подходят для одного пакета:
import "net/http"Определения:
- Go: язык программирования с компиляцией и сборкой в статические бинарники.
- http.HandlerFunc: тип функции-обработчика, принимающей (http.ResponseWriter, *http.Request).
Написание функции main
В Go точка входа — функция main в пакете main. Здесь мы регистрируем обработчик и запускаем сервер:
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}Пояснения:
- http.HandleFunc(“/“, index) связывает путь “/“ с функцией index.
- http.ListenAndServe(“:8080”, nil) запускает сервер на порту 8080 и будет принимать запросы бесконечно, пока процесс не завершится.
- log.Fatal прерывает выполнение программы и печатает ошибку, если ListenAndServe возвращает ошибку.
Важно: в Go есть строгие правила размещения фигурных скобок — открывающая скобка должна стоять на той же строке, где объявляется функция или условие.
Реализация обработчика
Добавим функцию index, которая формирует ответ клиенту:
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}Что происходит:
- w http.ResponseWriter — интерфейс для формирования HTTP‑ответа.
- r *http.Request — структура с данными запроса (метод, URL, заголовки и т.д.).
- fmt.Fprintf пишет форматированную строку в ответ; r.URL.Path[1:] возвращает часть пути после первого символа ‘/‘ (например, для /about вернёт “about”).
Полный код
Соберём всё вместе — сохраните файл как server.go:
package main
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}Если вы используете Vim, сохраните файл командой:
:wq server.goЗапуск и проверка
- Соберите и запустите сервер:
go build -o server server.go
./server- Откройте в браузере http://localhost:8080/ или выполните curl:
curl http://localhost:8080/Ожидаемый ответ: Hi there, welcome to ! — если путь корневой. Для /hello вернётся Hi there, welcome to hello!
Когда этот подход не подходит
- Нужен высокопроизводительный API с middleware, роутингом и группами маршрутов — лучше использовать фреймворки (Gin, Echo).
- Требуется сложная маршрутизация, middleware для аутентификации/логирования — ручная реализация вырастает в объёмах.
- Высокая нагрузка и требования к продвинутой балансировке/горизонтальному масштабированию — нужны дополнительные инструменты и архитектура.
Альтернативные подходы
- Использовать фреймворки: Gin, Echo, Fiber — дают маршрутизацию, middleware и удобный API.
- Использовать net/http + стандартные middleware (context, timeouts) для лёгкого контроля и минимальной зависимости.
- Интегрировать с reverse proxy (nginx) для SSL, статических файлов и балансировки нагрузки.
Мини‑методология: шаги разработки
- Определите контракты API (пути, ответы, коды).
- Напишите минимальный обработчик и запустите локально.
- Добавьте логирование и базовые тесты (unit и integration).
- Прогоняйте нагрузочные тесты и настройте таймауты/пулы соединений.
- Деплой через CI/CD с проверками и мониторингом.
Контрольные списки для ролей
Для разработчика:
- Реализован базовый обработчик
- Покрытие unit‑тестами основных веток
- Локальный запуск и проверка curl
Для оператора/инфраструктуры:
- Конфигурация reverse proxy для SSL
- Набор SLI/SLO и метрики (latency, error rate)
- План отката и мониторинг логов
Критерии приёмки
- Сервер возвращает 200 для корневого пути и корректный текст.
- Локальный тест: curl возвращает ожидаемое тело.
- Unit‑тесты для обработчика проходят.
- Сервер корректно стартует и останавливается без паники.
Тесты и примеры приёмки
Пример unit‑теста для index (псевдокод):
func TestIndex(t *testing.T) {
req := httptest.NewRequest("GET", "/hello", nil)
w := httptest.NewRecorder()
index(w, req)
resp := w.Result()
body, _ := io.ReadAll(resp.Body)
if string(body) != "Hi there, welcome to hello!" {
t.Fatalf("unexpected body: %s", body)
}
}Безопасность и твики для продакшена
Советы:
- Установите таймауты сервера (ReadTimeout, WriteTimeout) при использовании http.Server.
- Не доверяйте путям и входным данным — валидируйте и нормализуйте.
- Не оставляйте подробные ошибки пользователю в продакшне.
- Используйте reverse proxy (nginx) для SSL, rate limiting и статических ресурсов.
Пример создания http.Server с таймаутами:
srv := &http.Server{
Addr: ":8080",
Handler: nil, // default mux
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
}
log.Fatal(srv.ListenAndServe())Краткий глоссарий
- http.ResponseWriter — интерфейс для формирования ответа.
- http.Request — структура с данными HTTP‑запроса.
- HandlerFunc — функция, обрабатывающая HTTP‑запросы.
Итог
Создание простого веб‑сервера на Go занимает несколько строк кода, благодаря мощной стандартной библиотеке. Для простых задач net/http — идеальный выбор; для более сложных проектов рассмотрите фреймворки, тестирование и настройку сервера для продакшна.
Важно: перед деплоем всегда добавляйте тесты, таймауты и мониторинг.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone