Ответ
Слайс (slice) в Go — это гибкая и мощная структура данных, представляющая собой динамический вид на непрерывный участок базового массива (underlying array). Основные операции с ним включают:
-
Изменение элемента по индексу Это самая простая операция. Так как слайс ссылается на массив, изменение элемента в слайсе меняет его и в базовом массиве.
s := []int{10, 20, 30} s[1] = 25 // s теперь [10, 25, 30]
-
Добавление элементов с помощью
append
Функцияappend
добавляет элементы в конец слайса. Важно помнить:- Если в базовом массиве достаточно места (
capacity
), новый элемент будет добавлен туда же, а длина слайса увеличится. - Если места нет, Go выделит новый, больший массив, скопирует туда старые элементы, добавит новый и вернет слайс, указывающий уже на этот новый массив.
Поэтому результат
append
всегда нужно присваивать обратно в переменную слайса.s := []int{1, 2} s = append(s, 3, 4) // s теперь [1, 2, 3, 4]
- Если в базовом массиве достаточно места (
-
Удаление элемента В Go нет встроенной функции
delete
для слайсов. Удаление реализуется с помощьюappend
и срезов. Чтобы удалить элемент по индексуi
, нужно объединить часть слайса до этого элемента с частью после него.s := []int{1, 2, 3, 4, 5} i := 2 // Индекс элемента для удаления (значение 3) // Объединяем s[:2] (т.е. [1, 2]) и s[3:] (т.е. [4, 5]) s = append(s[:i], s[i+1:]...) // s теперь [1, 2, 4, 5]
-
Получение под-слайса (slicing) Операция
s[i:j]
создает новый заголовок слайса, который указывает на тот же самый базовый массив. Это очень эффективно, но опасно: изменение элементов в под-слайсе приведет к изменению данных в исходном слайсе.s := []int{1, 2, 3, 4, 5} sub := s[1:4] // sub это [2, 3, 4] sub[0] = 99 // Изменяем первый элемент sub // s теперь тоже изменился: [1, 99, 3, 4, 5]
-
Копирование с помощью
copy
Чтобы создать независимую копию слайса (с новым базовым массивом), используется функцияcopy
.src := []int{1, 2, 3} dst := make([]int, len(src)) copy(dst, src) dst[0] = 100 // Изменение dst не повлияет на src // src: [1, 2, 3], dst: [100, 2, 3]