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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

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

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Как структурировать большое приложение на Echo с использованием dependency injection?

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

Большое Echo-приложение структурируют через явную инъекцию зависимостей: контейнер зависимостей передаётся в хендлеры через метод-получатель на struct, а не через глобальные переменные или init().

Типичная структура каталогов

myapp/
  cmd/
    server/
      main.go          // точка входа, wire-up
  internal/
    config/
      config.go        // загрузка конфига (envconfig / viper)
    db/
      postgres.go      // *pgxpool.Pool
    repository/
      user_repo.go     // интерфейс + pg-реализация
    service/
      user_service.go  // бизнес-логика
    handler/
      user_handler.go  // echo.HandlerFunc через метод struct
    router/
      router.go        // регистрация маршрутов
  go.mod

Структура большого приложения на Echo с DI

Go не имеет встроенного IoC-контейнера, поэтому зависимости передаются явно — через конструкторы и методы. Наиболее распространённый паттерн: handler struct хранит ссылки на сервисы, а main.go (или пакет app) собирает граф зависимостей вручную.

Пример реализации

// internal/repository/user_repo.go
package repository

import "context"

type User struct {
	ID   int64  `json:"id"`
	Name string `json:"name"`
}

type UserRepository interface {
	FindByID(ctx context.Context, id int64) (*User, error)
}
// internal/service/user_service.go
package service

import (
	"context"

	"myapp/internal/repository"
)

type UserService struct {
	repo repository.UserRepository
}

func NewUserService(repo repository.UserRepository) *UserService {
	return &UserService{repo: repo}
}

func (s *UserService) GetUser(ctx context.Context, id int64) (*repository.User, error) {
	return s.repo.FindByID(ctx, id)
}
// internal/handler/user_handler.go
package handler

import (
	"net/http"
	"strconv"

	"github.com/labstack/echo/v4"
	"myapp/internal/service"
)

type UserHandler struct {
	svc *service.UserService
}

func NewUserHandler(svc *service.UserService) *UserHandler {
	return &UserHandler{svc: svc}
}

func (h *UserHandler) GetUser(c echo.Context) error {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		return echo.NewHTTPError(http.StatusBadRequest, "invalid id")
	}
	user, err := h.svc.GetUser(c.Request().Context(), id)
	if err != nil {
		return err
	}
	return c.JSON(http.StatusOK, user)
}
// cmd/server/main.go
package main

import (
	"log"

	"github.com/labstack/echo/v4"
	"myapp/internal/db"
	"myapp/internal/handler"
	"myapp/internal/repository"
	"myapp/internal/service"
)

func main() {
	pool, err := db.NewPool("postgres://user:pass@localhost:5432/myapp")
	if err != nil {
		log.Fatal(err)
	}

	// Граф зависимостей
	userRepo := repository.NewPostgresUserRepo(pool)
	userSvc := service.NewUserService(userRepo)
	userHandler := handler.NewUserHandler(userSvc)

	e := echo.New()
	e.GET("/users/:id", userHandler.GetUser)

	log.Fatal(e.Start(":8080"))
}

Автоматическая инъекция через Wire или fx

При большом числе зависимостей ручной wire-up становится громоздким. Используйте google/wire (кодогенерация) или go.uber.org/fx (runtime DI):

// wire.go (для google/wire)
//go:build wireinject

package main

import (
	"github.com/google/wire"
	"myapp/internal/handler"
	"myapp/internal/repository"
	"myapp/internal/service"
)

func initUserHandler(dsn string) (*handler.UserHandler, error) {
	wire.Build(
		db.NewPool,
		repository.NewPostgresUserRepo,
		service.NewUserService,
		handler.NewUserHandler,
	)
	return nil, nil
}

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

  • Глобальные переменные вместо DI — делают тестирование невозможным без мокирования пакет-уровневых состояний.
  • Передача *echo.Echo в сервисный слой — сервис не должен знать о транспорте; только хендлеры работают с echo.Context.
  • Инициализация БД внутри init() — порядок вызовов init непредсказуем при импорте.
  • Отсутствие интерфейсов у репозиториев — без интерфейса нельзя подменить реализацию в тестах.
  • Утечка *pgxpool.Pool через несколько слоёв вместо передачи через репозиторий — нарушает инкапсуляцию.
  • Смешение конфигурации и логики в одном struct — выделите config.Config отдельно и передавайте только нужные поля.
  • При использовании fx: забытый fx.Annotate при нескольких реализациях одного интерфейса приводит к панике при старте.
  • Circular dependencies — признак неправильного разбиения на пакеты; решается введением дополнительного слоя абстракции.

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

  • В каких backend-проектах Echo (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Как реализовать middleware JWT-аутентификации в Echo?
  • Как Echo обрабатывает CORS и как его настроить?
  • Как настроить TLS/HTTPS в Echo?

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

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

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

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

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

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

Источники

  • https://echo.labstack.com/docs/cookbook/testing
  • https://echo.labstack.com/docs/routing
←Предыдущий вопросКак реализовать graceful shutdown в сервере Echo?Следующий вопрос→Как Echo интегрируется со стандартным пакетом `net/http` — можно ли использовать стандартный `http.Handler` middleware?

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

Echodependency-managementechosystem-designtesting