Ответ
Для вставки элемента в середину слайса в 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:]...)...)
Разбор решения
slice[index:]...
— эта конструкция "распаковывает" все элементы слайса, начиная сindex
, в качестве аргументов для функции.append([]int{value}, slice[index:]...)
— создается новый временный слайс, который содержитvalue
и все последующие элементы изslice
.append(slice[:index], ...)
— к первой части исходного слайса (slice
доindex
) добавляются элементы из временного слайса, созданного на шаге 2.
Важные моменты
- Производительность: Эта операция неэффективна для больших слайсов и частых вставок, так как может потребовать аллокации нового базового массива и копирования всех элементов.
- Паника: Если
index
выходит за пределыlen(slice)
, произойдет паника. - Альтернативы: Для сценариев, требующих частых вставок в середину, лучше рассмотреть другие структуры данных, например, двусвязный список (
container/list
).