Готовим окружение: Go и модуль#
Понадобится локальный Go — свежая стабильная версия. Fiber v3 собран под новые версии языка, точный минимум указан в README репозитория (на момент написания это Go 1.26+), так что если ваш тулчейн старее, обновитесь заранее. Браузерная песочница этого сайта сетевые приложения не запускает, поэтому весь код урока — для вашего терминала: без локального Go его не проверить.
Go-проекты живут внутри модулей. Модуль — это папка с файлом go.mod, где записаны имя проекта, версия языка и список зависимостей. Создаём папку, инициализируем модуль — и только потом ставим Fiber.
Три команды в терминале
GOmkdir hello-fiber && cd hello-fiber
go mod init example.com/hello-fiber
go get github.com/gofiber/fiber/v3Первая команда создаёт папку проекта и переходит в неё. go mod init делает папку модулем и пишет файл go.mod — example.com/hello-fiber это имя модуля, для локального эксперимента подойдёт любое уникальное, при публикации в открытом репозитории оно совпадёт с адресом. go get скачивает Fiber v3 и добавляет его в зависимости в go.mod — вместе с fasthttp и остальными внутренними пакетами.
В туториалах прошлых лет вы встретите v2: go get github.com/gofiber/fiber/v2, импорт .../fiber/v2 и хендлеры с *fiber.Ctx (указатель). В v3 контекст — интерфейс fiber.Ctx без звёздочки. Пример одной версии не скомпилируется с другой — выбирайте v3 для новых проектов и держите версию единой внутри модуля.
Hello, World: полный код#
Создайте в папке проекта файл main.go и вставьте код ниже. Это полноценный сервер: после запуска он отвечает на запросы к корню и держит соединение, пока вы его не остановите. Если вы прошли базовый курс, незнакомым здесь будет только импорт fiber и сам объект app — всё остальное вы уже видели.
main.go
GOpackage main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main() {
app := fiber.New()
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("Hello, World!")
})
log.Fatal(app.Listen(":3000"))
}По строкам. Импорты: log — стандартный пакет для фатальных ошибок, fiber — сам фреймворк, версия видна в пути (v3). fiber.New() создаёт приложение с настройками по умолчанию. app.Get("/", ...) регистрирует маршрут «GET /». Хендлер — функция func(c fiber.Ctx) error: контекст даёт доступ к запросу и ответу, а возврат error обязателен — если вернуть не nil, ошибку обработает ErrorHandler (подробнее в уроке про ошибки). c.SendString пишет строку в тело ответа. app.Listen(":3000") поднимает сервер и блокирует выполнение; log.Fatal напечатает ошибку и завершит процесс с кодом 1, если она случится.
Что происходит при запросе#
Вы запустили сервер — Fasthttp открыл порт 3000 и слушает TCP-соединения. Клиент присылает GET /, движок парсит запрос и передаёт его Fiber; тот находит маршрут и вызывает ваш хендлер, передавая Ctx — фасад над запросом и ответом. Хендлер вернул nil — Fiber завершает ответ и возвращает контекст обратно в пул. Не уничтожает, а переиспользует: аллокаций меньше, скорость выше.
Отсюда правило, которое ломает новичков: после return из хендлера контекст жить перестал. Сохраните c.Params("id") в глобальную переменную и через секунду прочитаете там id чужого запроса. Нужны данные вне хендлера — копируйте значения в свои переменные и структуры, а не держите ссылку на Ctx. Пул переиспользования — та самая «zero allocation» архитектура из первого урока, у которой есть последствия.
Проверьте себя
Почему нельзя сохранить fiber.Ctx в глобальную переменную и пользоваться им после return из хендлера?
Проверяем в curl#
Запустите сервер командой go run . (точка означает «текущий пакет») и в другом окне терминала отправьте запрос. Флаг -i у curl заставит показать не только тело, но и служебные заголовки — для веб-разработчика это привычный способ заглянуть под капот.
Запрос и ответ
GOcurl -i http://localhost:3000/
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 13
Date: Sat, 07 Feb 2026 12:00:00 GMT
Hello, World!Разбор ответа. Статус 200 Fiber проставил сам, потому что хендлер вернул nil. Content-Type: text/plain — тело строка, Fiber понял это из SendString. Content-Length: 13 — длина строки «Hello, World!», посчитайте сами: тринадцать символов. Date — время ответа, стандарт для HTTP. Если увидели ровно это — сервер работает, первый fiber hello world готов.
Если на 3000 уже кто-то слушает, Listen вернёт ошибку вида «listen tcp :3000: bind: address already in use», log.Fatal напечатает её, и процесс завершится. Чаще всего порт держит старый go run, который вы не остановили по Ctrl+C. Смените адрес в Listen, например на ":8080", — первый аргумент это host:port.
Что получит клиент при запросе GET /status к маршруту из кода?
Прочитайте код и выберите, что он выведет:
app.Get("/status", func(c fiber.Ctx) error {
return c.SendStatus(fiber.StatusNotFound)
})Настройка приложения: fiber.Config#
fiber.New() без аргументов — это настройки по умолчанию. Для серьёзного приложения их переопределяют структурой fiber.Config. Самые ходовые поля: AppName — имя сервиса, его видно в баннере при старте; ReadTimeout, WriteTimeout и IdleTimeout — таймауты в формате time.Duration, защита от клиентов, которые держат соединение и молчат; BodyLimit — максимальный размер тела запроса в байтах, по умолчанию 4 МБ; ErrorHandler — единая точка обработки ошибок, к нему вернёмся в отдельном уроке.
fiber.New с конфигом
GOpackage main
import (
"log"
"time"
"github.com/gofiber/fiber/v3"
)
func main() {
app := fiber.New(fiber.Config{
AppName: "hello-fiber",
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
BodyLimit: 2 * 1024 * 1024, // 2 МБ вместо 4
})
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("OK")
})
log.Fatal(app.Listen(":3000"))
}ReadTimeout: 5 time.Second — пять секунд на чтение запроса, дальше соединение рвётся. WriteTimeout: 10 time.Second — столько даётся на запись ответа. BodyLimit: 2 1024 1024 — два мегабайта в байтах: 2 умножаем на 1024 (килобайты) и ещё раз на 1024 (мегабайты). Для API, который принимает только JSON, четырёх мегабайт по умолчанию много — режьте лимит, крупные тела запросов часто признак проблемы на клиенте.
Чек-лист запуска#
- go mod init example.com/hello-fiber — создать модуль
- go get github.com/gofiber/fiber/v3 — поставить Fiber
- Написать main.go: fiber.New, маршрут, app.Listen
- go run . — запустить сервер
- curl -i http://localhost:3000/ — проверить ответ
- Ctrl+C — остановить сервер перед правками кода
Сервер с конфигом
Допишите структуру конфига и запуск сервера. В поле подсказки — расшифровка имён.
От пустой папки до ответа сервера
Расставьте шаги в порядке выполнения: от инициализации модуля до проверки ответа.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Словарь урока
Что дальше#
Сервер отвечает, но пока у него один маршрут. В следующем уроке разберём маршрутизацию Fiber: методы HTTP, параметры пути вроде :id и правила, по которым роутер выбирает хендлер: Урок 3: маршрутизация. Код этого урока проверяется локально — curl и открытый терминал вам в руки.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- Проект на Fiber — обычный Go-модуль: go mod init, затем go get github.com/gofiber/fiber/v3.
- Hello world — это fiber.New(), app.Get с хендлером и log.Fatal(app.Listen(":3000")).
- Хендлер возвращает error: nil — ответ готов, ошибка уходит в ErrorHandler.
- fiber.Ctx переиспользуется пулом: данные из контекста копируйте, ссылку не храните.
- curl -i показывает статус, заголовки и тело — базовый инструмент проверки сервера.
- fiber.Config управляет таймаутами, лимитом тела и ErrorHandler; BodyLimit по умолчанию 4 МБ.
Домашнее задание
Добавьте в main.go второй маршрут app.Get("/about", ...) с коротким текстом о вашем проекте и поставьте ReadTimeout 3 секунды. Запустите сервер, проверьте оба маршрута через curl -i и найдите в выводе Content-Length каждого ответа — сверьте его с реальной длиной строки.
Личные заметкиПусто
Вопросы и ответы по уроку
Какая версия Go нужна для Fiber v3?
Свежая стабильная: v3 собирается под новые версии языка, минимум указан в README (на момент написания — Go 1.26+). Для v2 требования мягче, но лучше писать под v3.
Как поменять порт сервера?
В первом аргументе app.Listen — адрес вида host:port. ":3000" слушает все интерфейсы на порту 3000; укажите ":8080" или "127.0.0.1:3000", если нужен только локальный доступ.
Нужна ли горячая перезагрузка?
Не обязательна: после правок достаточно перезапустить go run . Если надоело, поставьте утилиту air — она пересобирает и перезапускает проект при каждом сохранении файла.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Сравните с альтернативами
Практический вопрос после первых уроков: а почему именно эта библиотека? Мы разобрали конкурентов по одним критериям, с кодом одной задачи рядом и персональным подбором под ваши приоритеты.
Изучайте дальше
Следующая ступень учебного пути
Gin: самый популярный веб-фреймворк Go
Курс Gin для Go: маршрутизация, binding, валидация, middleware, JWT, WebSocket, тесты и деплой. 25 уроков с кодом и итоговым REST API.
- Уверенно владеть gin.Engine: маршруты, группы, версии
- Привязывать запросы к структурам (ShouldBindJSON и др.)
- Писать middleware и использовать встроенные
- Строить аутентификацию на JWT