Перейти к основному содержимому

Slice в Go

Slice очень похож на массив, но мощнее и гибче.

Он тоже хранит много значений одного типа в одной переменной. Главное отличие — размер: slice может становиться длиннее или короче, когда вам это нужно, а массив не может.

Есть несколько вариантов создать его:

  • Записать значения напрямую, в форме []datatype{values}
  • Вырезать slice из существующего массива
  • Вызвать функцию make()

Создание slice с помощью []datatype{values}

Самый прямой способ объявить slice — перечислить его значения в фигурных скобках, как показывает синтаксис.

Две встроенные функции сообщают сведения о любом slice. len() возвращает его длину, то есть количество элементов, которые он сейчас содержит. cap() возвращает его ёмкость, то есть количество элементов, для которых в нём есть место.

Пример

Оба slice ниже записаны в этой форме. В первом нет значений, поэтому его длина и ёмкость равны 0; во втором четыре значения, поэтому обе равны 4:

Prompt
Создайте два slice с помощью литерального синтаксиса: один пустой и один со строковыми значениями. Выведите длину, ёмкость и значения обоих.
Вывод: Программа на Go и захваченный вывод

Синтаксис

main.go
slice_name := []datatype{values}

Создание slice из массива

Другой вариант — взять часть массива, указав начальную и конечную позиции в квадратных скобках.

Пример

arr1[2:4] охватывает элементы от индекса 2 до индекса 4, не включая его. Ёмкость равна 4, потому что начиная с индекса 2 в массиве остаётся четыре элемента:

Prompt
Создайте массив из шести целых чисел, затем создайте slice с индекса 2 по 4. Выведите slice, его длину и ёмкость.
Вывод: Программа на Go и захваченный вывод

Синтаксис

main.go
var myarray = [length]datatype{values} // An array
myslice := myarray[start:end]          // A slice made from the array

Создание slice с помощью функции make()

Вызов make() — третий способ получить slice, и он позволяет выбрать длину и ёмкость.

Примечание: ёмкость необязательна. Если её опустить, она получит то же значение, что и длина.

Пример

myslice1 получает длину 5 и ёмкость 10. В myslice2 ёмкость не указана, поэтому обе величины равны 5:

Prompt
Создайте slice с помощью функции make(): один с длиной и ёмкостью, другой только с длиной. Выведите значения, длину и ёмкость.
Вывод: Программа на Go и захваченный вывод

Синтаксис

main.go
slice_name := make([]type, length, capacity)