Как в Go добавить элемент в середину слайса?

Ответ

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

Пример:

package main

import "fmt"

func main() {
    slice := []int{10, 20, 40, 50}
    index := 2      // Индекс, куда нужно вставить элемент
    value := 30     // Значение для вставки

    // 1. Создаем временный слайс с новым элементом
    temp := append([]int{value}, slice[index:]...)
    // temp теперь [30, 40, 50]

    // 2. Присоединяем временный слайс к первой части исходного
    slice = append(slice[:index], temp...)

    fmt.Println(slice) // Вывод: [10 20 30 40 50]
}

Однострочное решение (более распространено):

slice = append(slice[:index], append([]int{value}, slice[index:]...)...)

Разбор решения

  1. slice[index:]... — эта конструкция "распаковывает" все элементы слайса, начиная с index, в качестве аргументов для функции.
  2. append([]int{value}, slice[index:]...) — создается новый временный слайс, который содержит value и все последующие элементы из slice.
  3. append(slice[:index], ...) — к первой части исходного слайса (slice до index) добавляются элементы из временного слайса, созданного на шаге 2.

Важные моменты

  • Производительность: Эта операция неэффективна для больших слайсов и частых вставок, так как может потребовать аллокации нового базового массива и копирования всех элементов.
  • Паника: Если index выходит за пределы len(slice), произойдет паника.
  • Альтернативы: Для сценариев, требующих частых вставок в середину, лучше рассмотреть другие структуры данных, например, двусвязный список (container/list).