Как эффективно объединить два слайса в Go?

Ответ

Для объединения двух (или более) слайсов в Go используется встроенная функция append в сочетании с оператором ... (variadic argument).

Основной способ:

sliceA := []int{1, 2, 3}
sliceB := []int{4, 5, 6}

// Оператор ... распаковывает sliceB в отдельные элементы
combined := append(sliceA, sliceB...)

// combined теперь равен: []int{1, 2, 3, 4, 5, 6}

Важные моменты и производительность:

  1. Поведение append и capacity:

    • Если у sliceA достаточно свободной емкости (capacity), элементы sliceB будут добавлены в тот же базовый массив, изменяя sliceA.
    • Если емкости недостаточно, append выделит новый, больший массив, скопирует туда элементы из sliceA, а затем добавит элементы из sliceB. В этом случае combined будет указывать на новый массив, а sliceA останется неизменным.
  2. Оптимизация для больших слайсов: Чтобы избежать многократных перераспределений памяти при объединении нескольких или больших слайсов, лучше заранее выделить слайс нужного размера.

    // Создаем слайс с нужной длиной и емкостью
    result := make([]int, 0, len(sliceA) + len(sliceB))
    
    // Добавляем слайсы. Эти вызовы append не вызовут новых аллокаций.
    result = append(result, sliceA...)
    result = append(result, sliceB...)

    Этот подход является наиболее производительным, так как выполняет только одну аллокацию памяти.