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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python15 655
  • Облачные технологии11 901
  • QA вакансии3 405
  • Backend вакансии1 917
  • Инженер данных1 435
  • Продакт-менеджер891

Разработка

  • Android1 772
  • iOS1 646
  • AI вакансии901
  • Fullstack вакансии801
  • Frontend вакансии678
  • Mobile вакансии33

По стеку

  • Go8 449
  • Java5 599
  • Node.js1 779
  • Kotlin1 475
  • Rust1 398
  • .NET1 370
  • PHP574
  • C#436
  • C++424

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

  • Kubernetes6 670
  • DevOps вакансии5 099
  • Linux-инфраструктура4 926
  • Terraform / IaC3 701
  • CI/CD1 889
  • Мониторинг и Observability1 699
  • SRE516
  • Кибербезопасность262

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

  • Data Scientist797
  • Аналитик данных764
  • Бизнес-аналитик738
  • Системный аналитик96

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

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

По регионам

  • Вакансии в США41 869
  • Вакансии в Европе17 422
  • Вакансии в Канаде4 056
  • Работа в России3 874

По формату

  • Удалённые вакансии67 491
  • Релокация в США42 199
  • Гибридная работа9 848
  • Офисная работа6 812

По уровню

  • Senior вакансии38 497
  • Middle вакансии18 722
  • Junior вакансии6 245

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

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Как работают группы маршрутов в Gin и каковы их сценарии использования?

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

Группы маршрутов в Gin создаются через r.Group("/prefix", middleware...) и объединяют маршруты с общим URL-префиксом и middleware. Основные сценарии: версионирование API (/api/v1, /api/v2) и разделение публичных и приватных эндпоинтов.

Базовый синтаксис

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// Группа /api/v1
	v1 := r.Group("/api/v1")
	{
		v1.GET("/users", listUsers)       // GET /api/v1/users
		v1.POST("/users", createUser)     // POST /api/v1/users
		v1.GET("/users/:id", getUser)     // GET /api/v1/users/:id
		v1.PUT("/users/:id", updateUser)  // PUT /api/v1/users/:id
		v1.DELETE("/users/:id", deleteUser) // DELETE /api/v1/users/:id
	}

	// Группа /api/v2
	v2 := r.Group("/api/v2")
	{
		v2.GET("/users", listUsersV2)
	}

	r.Run(":8080")
}

Группы маршрутов в Gin

Группа маршрутов (RouterGroup) позволяет объединять маршруты с общим префиксом пути и/или общим набором middleware. Это ключевой инструмент для структурирования API.

Middleware на уровне группы

Middleware, переданный в Group(), применяется только к маршрутам этой группы:

func AuthRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("Authorization")
		if token == "" {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
				"error": "unauthorized",
			})
			return
		}
		c.Next()
	}
}

func main() {
	r := gin.New()
	r.Use(gin.Recovery())

	// Публичные маршруты — без аутентификации
	public := r.Group("/")
	{
		public.POST("/login", loginHandler)
		public.GET("/health", healthHandler)
	}

	// Приватные маршруты — требуют токен
	private := r.Group("/api", AuthRequired())
	{
		private.GET("/profile", profileHandler)
		private.POST("/orders", createOrderHandler)
	}

	r.Run(":8080")
}

Вложенные группы

Группы можно вкладывать друг в друга для более детальной структуры:

admin := r.Group("/admin", AuthRequired(), AdminOnly())
{
	users := admin.Group("/users")
	{
		users.GET("/", listAdminUsers)       // GET /admin/users/
		users.DELETE("/:id", deleteUser)     // DELETE /admin/users/:id
	}

	posts := admin.Group("/posts")
	{
		posts.GET("/", listAdminPosts)       // GET /admin/posts/
		posts.POST("/", createPost)          // POST /admin/posts/
	}
}

Группы для версионирования API

func RegisterV1Routes(rg *gin.RouterGroup) {
	rg.GET("/products", listProductsV1)
	rg.GET("/products/:id", getProductV1)
}

func RegisterV2Routes(rg *gin.RouterGroup) {
	rg.GET("/products", listProductsV2) // другая пагинация/формат
	rg.GET("/products/:id", getProductV2)
}

func main() {
	r := gin.Default()
	RegisterV1Routes(r.Group("/api/v1"))
	RegisterV2Routes(r.Group("/api/v2"))
	r.Run(":8080")
}

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

  • Фигурные скобки — только для читаемости. Синтаксис v1 := r.Group(...) { ... } — это обычный блок Go, не обязательный. Маршруты можно регистрировать без блока.
  • Middleware группы не наследуется автоматически вложенными группами. При вызове admin.Group("/users") middleware AdminOnly() НЕ передаётся в подгруппу — нужно явно передавать или добавлять через subgroup.Use().
  • Нельзя добавить middleware к группе после регистрации маршрутов. Вызов group.Use(mw) после group.GET(...) не применит middleware к уже зарегистрированным маршрутам.
  • Конфликты префиксов. Маршруты /api в одной группе и /api/v1 в другой не конфликтуют, но /api/:version и /api/v1 вызовут панику при регистрации.
  • Порядок middleware в глобальном Use() vs группового. Глобальные middleware (r.Use()) выполняются до групповых. Учитывайте это при проектировании цепочки аутентификации.
  • Пустой префикс группы. r.Group("") создаёт группу без добавления к пути — используется исключительно для применения middleware без изменения структуры URL.

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

  • В каких backend-проектах Gin (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Что такое система валидации Gin и как использовать struct tags для валидации входных данных?
  • Как писать unit-тесты для Gin-обработчиков с помощью httptest?
  • Как реализовать middleware аутентификации (JWT) в Gin?

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

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

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

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

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

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

Источники

  • https://gin-gonic.com/en/docs/routing/grouping-routes/
  • https://gin-gonic.com/en/docs/middleware/
←Предыдущий вопросКак реализовать логирование запросов в Gin?Следующий вопрос→Как Gin достигает высокой производительности? Для чего используется radix tree httprouter?

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

Ginapi-designframework-basicsGINRouting