> Как оптимизировать память при слиянии массивов? (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: InDrive

Стек: Go

> Пример ответа

При слиянии массивов в Go основная проблема - избежать лишних аллокаций и копирований. Вот ключевые техники:

  1. Заранее выделить память - используйте make с известной итоговой длиной. Это предотвращает многократное расширение слайса (амортизация O(1) на append, но с накладными расходами).
GO
func merge(a, b []int) []int {
result := make([]int, 0, len(a)+len(b))
// ... слияние с append
}
  1. Избегать копирования при слиянии на месте - если один из массивов можно модифицировать, сливайте прямо в него, используя copy для сдвига элементов.
GO
func mergeInPlace(a, b []int) []int {
a = append(a, b...) // копирует b в конец a
sort.Ints(a) // если нужно отсортировать
return a
}
  1. Использовать copy вместо append - когда известна точная позиция вставки, copy эффективнее, так как не проверяет capacity.

  2. Для больших массивов - слайсы без копирования - если данные не нужно менять, возвращайте комбинацию слайсов через reflect.SliceHeader (опасно, только для чтения).

  3. Пул объектов - при частом слиянии используйте sync.Pool для переиспользования буферов.

Главное правило: измеряйте профилировщиком - часто узким местом оказывается не аллокация, а копирование данных (O(n) по определению).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью