Fiber для Go: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Fiber и зачем он нужен?

Fiber — это быстрый веб-фреймворк для Go, вдохновленный популярным фреймворком Express.js для Node.js. Он создан для разработки высокопроизводительных веб-приложений и API с минимальным потреблением памяти. Fiber использует неблокирующую модель ввода-вывода на основе горутин (goroutines) и пакета fasthttp, что делает его одним из самых быстрых веб-фреймворков для Go.

Зачем нужен Fiber?

  • Производительность: Fiber работает значительно быстрее стандартного пакета net/http за счет использования fasthttp. Он способен обрабатывать десятки тысяч запросов в секунду.
  • Простота и знакомый синтаксис: Если вы знакомы с Express.js, вы быстро освоите Fiber. API очень похож: маршруты, middleware, обработчики запросов — всё интуитивно понятно.
  • Нулевое выделение памяти (zero memory allocation): Fiber старается минимизировать выделение памяти, что снижает нагрузку на сборщик мусора и повышает стабильность.
  • Расширяемость: Большое количество встроенных middleware (CORS, логирование, сжатие, сессии и т.д.) и возможность создавать собственные.
  • Поддержка современных стандартов: Fiber поддерживает HTTP/2, WebSocket, шаблонизаторы, статические файлы и многое другое.

Установка Fiber

Fiber — это библиотека для Go, поэтому установка производится через стандартный менеджер пакетов Go. Убедитесь, что у вас установлен Go версии 1.16 или выше.

# Инициализация модуля (если ещё не сделано)
go mod init myapp

# Установка Fiber (последняя стабильная версия)
go get github.com/gofiber/fiber/v2

После этого вы можете импортировать Fiber в свой проект:

import "github.com/gofiber/fiber/v2"

Примечание: Если вы используете более старую версию Go, может потребоваться установка Fiber v1. Однако рекомендуется использовать v2, так как она активнее развивается.

Быстрый старт с примером кода

Создайте файл main.go и напишите простейший HTTP-сервер:

package main

import "github.com/gofiber/fiber/v2"

func main() {
    // Создаём новое приложение Fiber
    app := fiber.New()

    // Определяем маршрут GET /
    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello, Fiber!")
    })

    // Запускаем сервер на порту 3000
    app.Listen(":3000")
}

Запустите сервер:

go run main.go

Откройте браузер и перейдите по адресу http://localhost:3000. Вы увидите сообщение "Hello, Fiber!".

Объяснение:

  • fiber.New() — создает новый экземпляр приложения.
  • app.Get("/", handler) — регистрирует обработчик для GET-запроса на корневой путь.
  • c *fiber.Ctx — контекст запроса, предоставляющий доступ к данным запроса и ответа.
  • c.SendString() — отправляет строку в качестве ответа.
  • app.Listen(":3000") — запускает сервер на порту 3000.

Основные методы и функции Fiber

Рассмотрим 10 ключевых методов и функций Fiber с подробным описанием и примерами.

1. fiber.New()

Что делает: Создает новый экземпляр приложения Fiber с настройками по умолчанию или с переданной конфигурацией.

Параметры: Принимает необязательный аргумент config ...fiber.Config — структуру с настройками (например, AppName, Prefork, ServerHeader и т.д.).

Пример:

package main

import "github.com/gofiber/fiber/v2"

func main() {
    // Создание с настройками по умолчанию
    app := fiber.New()

    // Создание с кастомной конфигурацией
    app2 := fiber.New(fiber.Config{
        AppName:      "MyApp",
        ServerHeader: "Fiber",
        Prefork:      true, // Использовать все ядра CPU
    })

    app.Listen(":3000")
    app2.Listen(":4000")
}

2. app.Get(), app.Post(), app.Put(), app.Delete()

Что делает: Регистрируют обработчики для соответствующих HTTP-методов (GET, POST, PUT, DELETE) по указанному пути.

Параметры:

  • path string — путь маршрута (например, "/users/:id").
  • handlers ...fiber.Handler — одна или несколько функций-обработчиков (middleware).

Пример:

app.Get("/users", func(c *fiber.Ctx) error {
    return c.SendString("Список пользователей")
})

app.Post("/users", func(c *fiber.Ctx) error {
    return c.SendString("Создан новый пользователь")
})

app.Put("/users/:id", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.SendString("Обновлён пользователь с ID: " + id)
})

app.Delete("/users/:id", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.SendString("Удалён пользователь с ID: " + id)
})

3. c.Params()

Что делает: Извлекает значение параметра маршрута (например, из пути /users/:id).

Параметры: key string — имя параметра.

Пример:

app.Get("/users/:id", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.SendString("ID пользователя: " + id)
})

// Пример запроса: GET /users/42
// Ответ: "ID пользователя: 42"

4. c.Query()

Что делает: Извлекает значение query-параметра из URL (например, ?name=John).

Параметры: key string — имя параметра. Необязательный второй аргумент — значение по умолчанию.

Пример:

app.Get("/search", func(c *fiber.Ctx) error {
    name := c.Query("name", "Guest")
    age := c.Query("age")
    return c.SendString("Привет, " + name + "! Возраст: " + age)
})

// Пример запроса: GET /search?name=Alice&age=30
// Ответ: "Привет, Alice! Возраст: 30"

5. c.BodyParser()

Что делает: Парсит тело запроса (JSON, XML, form-data) в переданную структуру.

Параметры: out interface{} — указатель на структуру, в которую будут записаны данные.

Пример:

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

app.Post("/users", func(c *fiber.Ctx) error {
    user := new(User)
    if err := c.BodyParser(user); err != nil {
        return c.Status(400).SendString("Ошибка парсинга: " + err.Error())
    }
    return c.JSON(user)
})

// Пример запроса: POST /users с телом {"name":"Bob","age":25}
// Ответ: {"name":"Bob","age":25}

6. c.JSON()

Что делает: Отправляет ответ в формате JSON с установленным Content-Type.

Параметры: data interface{} — любые данные, которые будут сериализованы в JSON.

Пример:

app.Get("/api/user", func(c *fiber.Ctx) error {
    user := fiber.Map{
        "name": "Alice",
        "age":  30,
    }
    return c.JSON(user)
})

// Ответ: {"age":30,"name":"Alice"}

7. c.Status()

Что делает: Устанавливает HTTP-статус ответа. Возвращает контекст для цепочки вызовов.

Параметры: status int — код HTTP-статуса (например, 200, 404, 500).

Пример:

app.Get("/notfound", func(c *fiber.Ctx) error {
    return c.Status(404).SendString("Страница не найдена")
})

app.Get("/error", func(c *fiber.Ctx) error {
    return c.Status(500).JSON(fiber.Map{
        "error": "Внутренняя ошибка сервера",
    })
})

8. app.Use()

Что делает: Регистрирует middleware (промежуточное ПО), которое будет выполняться для всех или определённых маршрутов.

Параметры: args ...interface{} — может принимать путь (строку) и/или функции-обработчики.

Пример:

// Middleware для логирования всех запросов
app.Use(func(c *fiber.Ctx) error {
    fmt.Println("Запрос:", c.Method(), c.Path())
    return c.Next() // Передаём управление следующему обработчику
})

// Middleware только для определённого пути
app.Use("/api", func(c *fiber.Ctx) error {
    c.Set("X-Custom-Header", "MyValue")
    return c.Next()
})

9. app.Static()

Что делает: Обслуживает статические файлы из указанной директории.

Параметры:

  • prefix string — префикс URL (например, "/static").
  • root string — корневая директория на сервере.

Пример:

// Обслуживание файлов из папки ./public по пути /static
app.Static("/static", "./public")

// Теперь файл ./public/style.css доступен по адресу /static/style.css

// Можно также обслуживать корневой путь
app.Static("/", "./public")

10. app.Listen()

Что делает: Запускает HTTP-сервер на указанном адресе и порту. Блокирует выполнение до остановки сервера.

Параметры: addr string — адрес и порт (например, ":3000" или "0.0.0.0:8080").

Пример:

app.Listen(":3000")

// С использованием TLS (HTTPS)
app.ListenTLS(":443", "./cert.pem", "./key.pem")

Реальный практический пример использования

Создадим простое REST API для управления списком задач (Todo List) с использованием Fiber. API будет поддерживать CRUD-операции.

package main

import (
    "github.com/gofiber/fiber/v2"
    "strconv"
)

// Структура задачи
type Todo struct {
    ID    int    `json:"id"`
    Title string `json:"title"`
    Done  bool   `json:"done"`
}

// Хранилище задач (в памяти)
var todos = []Todo{
    {ID: 1, Title: "Изучить Fiber", Done: false                    

Рекомендаций