Расскажите об основных операциях со слайсами: изменение, добавление и удаление элементов.

Ответ

Слайс (slice) в Go — это гибкая и мощная структура данных, представляющая собой динамический вид на непрерывный участок базового массива (underlying array). Основные операции с ним включают:

  1. Изменение элемента по индексу Это самая простая операция. Так как слайс ссылается на массив, изменение элемента в слайсе меняет его и в базовом массиве.

    s := []int{10, 20, 30}
    s[1] = 25 // s теперь [10, 25, 30]
  2. Добавление элементов с помощью append Функция append добавляет элементы в конец слайса. Важно помнить:

    • Если в базовом массиве достаточно места (capacity), новый элемент будет добавлен туда же, а длина слайса увеличится.
    • Если места нет, Go выделит новый, больший массив, скопирует туда старые элементы, добавит новый и вернет слайс, указывающий уже на этот новый массив. Поэтому результат append всегда нужно присваивать обратно в переменную слайса.
      s := []int{1, 2}
      s = append(s, 3, 4) // s теперь [1, 2, 3, 4]
  3. Удаление элемента В 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]
  4. Получение под-слайса (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]
  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]