Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 987новых вакансий за сутки·91 463вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 238
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python16 417
  • Облачные технологии13 174
  • QA вакансии3 433
  • Backend вакансии2 035
  • Инженер данных1 666
  • Продакт-менеджер1 162

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии937
  • Fullstack вакансии892
  • Frontend вакансии717
  • Mobile вакансии38

По стеку

  • Go8 561
  • Java6 090
  • Node.js1 889
  • Kotlin1 554
  • .NET1 545
  • Rust1 432
  • PHP640
  • C#562
  • C++498

DevOps и инфраструктура

  • Kubernetes7 303
  • DevOps вакансии5 594
  • Linux-инфраструктура5 291
  • Terraform / IaC4 014
  • CI/CD2 557
  • Мониторинг и Observability1 735
  • SRE548
  • Кибербезопасность398

Аналитика и данные

  • Data Scientist1 033
  • Бизнес-аналитик868
  • Аналитик данных829
  • Системный аналитик134

Другие направления

  • Проджект-менеджер524
  • UI/UX дизайн129
  • Ручное тестирование14

По регионам

  • Вакансии в США44 779
  • Вакансии в Европе21 327
  • Вакансии в Канаде4 450
  • Работа в России3 877

По формату

  • Удалённые вакансии73 902
  • Релокация в США44 794
  • Гибридная работа11 412
  • Офисная работа6 956

По уровню

  • Senior вакансии41 197
  • Middle вакансии20 361
  • Junior вакансии6 638

Сейчас нанимают

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FiberВсе вопросы
FiberSeniorТеория

В чём различия между Fiber v2 и его предшественником по API и функциональности?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Fiber v2 перешёл на модульную архитектуру с отдельными пакетами middleware, изменил сигнатуры обработчиков на возврат error, добавил Ctx.BodyParser, Generic-роуты и улучшил производительность за счёт fasthttp обновлений.

1. Сигнатура обработчика

Самое заметное изменение: handlers теперь возвращают error.

// v1
app.Get("/", func(c *fiber.Ctx) {
	c.Send("hello")
})

// v2
app.Get("/", func(c *fiber.Ctx) error {
	return c.SendString("hello")
})

Это позволяет централизованно обрабатывать ошибки через app.Use(ErrorHandler) и стандартный паттерн Go.

Fiber v2 vs v1: ключевые отличия

Fiber v2 — это не инкрементальное обновление, а переработка API с нарушением обратной совместимости. Изменения охватывают сигнатуры, middleware-экосистему, конфигурацию и обработку ошибок.

2. Централизованная обработка ошибок

app := fiber.New(fiber.Config{
	ErrorHandler: func(c *fiber.Ctx, err error) error {
		code := fiber.StatusInternalServerError
		var e *fiber.Error
		if errors.As(err, &e) {
			code = e.Code
		}
		return c.Status(code).JSON(fiber.Map{"error": err.Error()})
	},
})

В v1 ошибки нужно было обрабатывать внутри каждого обработчика вручную.

3. Middleware вынесены в отдельные репозитории

В v1 все middleware были частью основного пакета. В v2 каждый middleware живёт в github.com/gofiber/fiber/v2/middleware/:

import (
	"github.com/gofiber/fiber/v2/middleware/cors"
	"github.com/gofiber/fiber/v2/middleware/logger"
	"github.com/gofiber/fiber/v2/middleware/recover"
	"github.com/gofiber/fiber/v2/middleware/limiter"
)

app.Use(recover.New())
app.Use(logger.New(logger.Config{
	Format: "${method} ${path} ${status} ${latency}\n",
}))
app.Use(cors.New(cors.Config{
	AllowOrigins: "https://example.com",
	AllowHeaders: "Origin, Content-Type, Authorization",
}))
app.Use(limiter.New(limiter.Config{
	Max:        100,
	Expiration: 1 * time.Minute,
}))

4. BodyParser и валидация

type LoginRequest struct {
	Email    string `json:"email" validate:"required,email"`
	Password string `json:"password" validate:"required,min=8"`
}

app.Post("/login", func(c *fiber.Ctx) error {
	var req LoginRequest
	if err := c.BodyParser(&req); err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "invalid body")
	}
	// ...
	return c.JSON(fiber.Map{"token": "..."})
})

В v1 парсинг тела требовал отдельного вызова c.JSON() только для отправки; входящий JSON парсился через c.BodyParser(), но API был менее стабильным.

5. Prefork и конфигурация приложения

app := fiber.New(fiber.Config{
	Prefork:               true,     // SO_REUSEPORT, несколько процессов
	CaseSensitive:         true,     // /User != /user
	StrictRouting:         true,     // /foo/ != /foo
	ServerHeader:          "Fiber",
	BodyLimit:             4 * 1024 * 1024, // 4 MB
	ReadTimeout:           5 * time.Second,
	WriteTimeout:          10 * time.Second,
	DisableStartupMessage: false,
})

6. Новые методы Ctx

  • c.Bind() — привязка query/form/json из одного вызова (v2.50+)
  • c.GetReqHeaders() — все заголовки как map
  • c.Protocol() — http или https с учётом X-Forwarded-Proto
  • c.IsFromLocal() — проверка локального IP
  • c.SaveFile() / c.SaveFileToStorage() — сохранение multipart

7. Маршрутизация

// Группы с middleware (v2 API стабилизирован)
api := app.Group("/api", authMiddleware)
v1 := api.Group("/v1")
v1.Get("/users", getUsers)
v1.Post("/users", createUser)

// Named параметры + regex
app.Get("/user/:id<int>", getUserById)  // только числовые id
app.Get("/files/*",       serveFiles)   // wildcard

Подводные камни

  • Миграция сигнатур: если вы копируете handler из v1-проекта, компилятор не сразу укажет на отсутствие error в возврате — тип func(*fiber.Ctx) и func(*fiber.Ctx) error несовместимы.
  • c.Body() возвращает слайс байт: в v2 тело запроса доступно только до конца хендлера — после него буфер освобождается fasthttp. Если нужно хранить тело дольше, скопируйте его: body := make([]byte, len(c.Body())); copy(body, c.Body()).
  • Prefork на Windows: Prefork: true не работает на Windows (нет SO_REUSEPORT). Приложение упадёт с ошибкой при старте.
  • c.Locals() и горутины: передавать *fiber.Ctx в горутины опасно — контекст переиспользуется пулом. Копируйте нужные данные в переменные до запуска горутины.
  • Изменение импортного пути: v2 использует github.com/gofiber/fiber/v2, а не github.com/gofiber/fiber. Забытый старый импорт тихо компилируется с другим API.
  • Middleware порядок: recover.New() нужно регистрировать первым, до всех остальных middleware — иначе паника в cors или logger не будет поймана.
  • fiber.Error vs обычный error: fiber.NewError(404, "not found") автоматически устанавливает HTTP-статус в ErrorHandler; обычный errors.New() даст 500.

Частые вопросы на собеседовании

  • В каких backend-проектах Fiber (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Как понять, что проблема в сервисе связана с Fiber (Go framework), а не с базой, сетью, инфраструктурой или бизнес-логикой?
  • Проект на Fiber (Go framework) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?
  • Представьте, endpoint на Fiber (Go framework) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?

Типичные ошибки

  • Давать ответ про различия Fiber v2 и v1 только на уровне определения, не показывая поведение в реальном приложении.
  • Игнорировать границы ответственности вокруг темы «различия Fiber v2 и v1»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
  • Не связывать различия Fiber v2 и v1 с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.

Что проверяет интервьюер

  • Точно объясняет, что именно делает различия Fiber v2 и v1 и где это используется в Go-коде.
  • Связывает различия Fiber v2 и v1 с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
  • Не изобретает API и опирается на реальные контракты официальной документации.

Как вы знаете этот вопрос?

Проверить себя по теме Fiber →

Источники

  • https://docs.gofiber.io/v1.x/guide/error-handling
  • https://docs.gofiber.io/v2.x/guide/error-handling/

Связанные темы

Fiberframework-upgradesmaintainabilitytechnical-reasoning