> Как архитектурно передавать на фронт сложную структуру с вложенными полями и массивами (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Для передачи сложных вложенных структур на фронт в Go-бэкенде оптимальным подходом является использование JSON-сериализации с явным определением DTO (Data Transfer Objects). Основные рекомендации:
-
Определите DTO-структуры - создайте отдельные типы для ответов API, избегая прямого использования моделей БД. Это позволяет контролировать, какие поля и как попадают на фронт.
GOtype UserResponse struct {ID int `json:"id"`Name string `json:"name"`Address AddressDTO `json:"address"`Orders []OrderDTO `json:"orders"`}type AddressDTO struct {City string `json:"city"`Street string `json:"street"`}type OrderDTO struct {ID int `json:"id"`Total float64 `json:"total"`Items []ItemDTO `json:"items"`} -
Используйте теги
jsonдля точного контроля имен полей, пропуска нулевых значений (omitempty) и обработки вложенности. -
Применяйте кастомную сериализацию для сложных преобразований (например, flattening или агрегация данных) через реализацию интерфейса
json.Marshaler. -
Избегайте циклических ссылок - используйте ID вместо полных объектов, если необходимо сослаться на связанные сущности.
-
Для больших вложенных массивов рассмотрите пагинацию на уровне API, передавая только часть данных.
Пример контроллера:
GOfunc GetUser(w http.ResponseWriter, r *http.Request) {user := fetchUserFromDB()orders := fetchOrdersWithItems(user.ID)resp := UserResponse{ID: user.ID,Name: user.Name,Address: AddressDTO{City: user.Address.City,Street: user.Address.Street,},Orders: mapOrdersToDTO(orders),}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(resp)}
Такой подход гарантирует четкий контракт между бэкендом и фронтом, упрощает тестирование и поддержку.
> Похожие задачи по backend
Куда помещать горутину для чтения из канала в Go
Как отследить и исправить deadlock в Go при работе с каналами и горутинами
В какой версии Go был исправлен баг с указателями в цикле
Как контролировать уникальные указатели и умножать их ровно один раз в функции double в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью