Гид по технологиям

Простой веб-сервер на Go

4 min read Разработка Обновлено 30 Dec 2025
Простой веб‑сервер на Go
Простой веб‑сервер на Go

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

Визуализация: веб‑сервер на Go

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

Запуск и проверка

  1. Соберите и запустите сервер:
go build -o server server.go
./server
  1. Откройте в браузере 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, статических файлов и балансировки нагрузки.

Мини‑методология: шаги разработки

  1. Определите контракты API (пути, ответы, коды).
  2. Напишите минимальный обработчик и запустите локально.
  3. Добавьте логирование и базовые тесты (unit и integration).
  4. Прогоняйте нагрузочные тесты и настройте таймауты/пулы соединений.
  5. Деплой через 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 — идеальный выбор; для более сложных проектов рассмотрите фреймворки, тестирование и настройку сервера для продакшна.

Важно: перед деплоем всегда добавляйте тесты, таймауты и мониторинг.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство