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

Ответ

В Go существует несколько способов объединения слайсов, каждый из которых подходит для разных ситуаций.


  1. С помощью append и оператора ... (самый идиоматичный способ)

    Этот метод наиболее читаемый и распространенный. Оператор ... "распаковывает" второй слайс на отдельные элементы для функции append.


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

    combined := append(sliceA, sliceB...)
    // combined теперь [1 2 3 4 5 6]

    Важно: append может как модифицировать исходный слайс (если в его capacity достаточно места), так и выделить новый массив. Поэтому результат всегда нужно присваивать переменной.



  2. С помощью copy и make (производительный способ для больших слайсов)

    Этот способ эффективен, когда размеры слайсов заранее известны. Он позволяет избежать многократных переаллокаций памяти, которые могут произойти при использовании append.


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

    // Создаем новый слайс нужной длины
    result := make([]int, len(sliceA) + len(sliceB))

    // Копируем данные
    copy(result, sliceA)
    copy(result[len(sliceA):], sliceB)
    // result теперь [1 2 3 4 5 6]


  3. С помощью цикла (гибкий способ)

    Используется редко, в основном когда перед добавлением элементы нужно как-то обработать.


    sliceA := []int{1, 2}
    sliceB := []int{3, 4}
    var result []int

    for _, v := range sliceA {
    result = append(result, v)
    }
    for _, v := range sliceB {
    result = append(result, v)
    }
    // result теперь [1 2 3 4]

Для объединения более двух слайсов можно просто последовательно вызывать append:

all := append(sliceA, sliceB...)
all = append(all, sliceC...)