Назад к вопросам
Junior
115
questionbank

Как работать со слайсами в Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Слайсы в Go не являются массивами, а ссылаются на сегмент (или весь) базового массива. Это динамические структуры данных.

Создание слайса:

  • Из массива:
    // определяем массив
    arr := [5]int{1, 2, 3, 4, 5}
    // создаем слайс из части массива
    s1 := arr[1:4] // s1 содержит элементы arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 содержит элементы arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 содержит элементы arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 ссылается на весь массив
    
  • С помощью make:
    // Создание слайса с длиной 5 и емкостью 5
    s := make([]int, 5)
    // Создание слайса с длиной 5 и емкостью 10
    s_cap := make([]int, 5, 10)
    
  • Литералом:
    s := []int{1, 2, 3}
    

Основные свойства слайса:

  • len(s): возвращает текущую длину слайса.
  • cap(s): возвращает емкость слайса (максимальное количество элементов, которое может содержаться до reallocation).

Добавление элементов (append):

s := []int{1, 2}
s = append(s, 3)      // добавляет один элемент
s = append(s, 4, 5)   // добавляет несколько элементов
s2 := []int{6, 7}
s = append(s, s2...) // добавляет элементы другого слайса

append может вызвать reallocation базового массива, если емкости недостаточно.

Удаление элементов:

Удаление элементов из слайса достигается путем создания нового слайса из оставшихся элементов или копирования.

s := []int{1, 2, 3, 4, 5}
// Удаление элемента по индексу i
i := 2 // удаляем элемент по индексу 2 (т.е. 3)
s = append(s[:i], s[i+1:]...)

Копирование слайсов:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // копирует элементы из src в dst

copy копирует минимум из длин двух слайсов.

Итерация по слайсу:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - индекс, v - значение
}
for i := range s {
    // только индекс
}
for _, v := range s {
    // только значение
}

Слайсы являются ссылочными типами:

Изменения в слайсе отображаются на базовом массиве и других слайсах, ссылающихся на ту же область памяти.

arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]

s1[0] = 99
// Теперь arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (элемент arr[2] изменился)