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

Доступ к элементам slice

Значение из slice читается по индексу: укажите номер его позиции в квадратных скобках.

Позиции отсчитываются с 0, поэтому [0] — первый элемент, [1] — второй, и так далее до конца slice.

Пример

Вывод индексов 0 и 2 показывает первое и третье значения в prices:

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

Изменение элементов slice

Присваивание по индексу перезаписывает значение, которое там хранится.

Пример

Третье значение в prices меняется с 30 на 50:

Prompt
Создайте slice целых чисел. Измените третий элемент, затем выведите первый и третий.
Вывод: программа на Go и захваченный вывод

Добавление элементов в slice

Функция append() добавляет новые значения после последнего элемента. Присвойте её результат обратно в slice, как показывает синтаксис:

Пример

Два новых значения, 20 и 21, добавляются в конец myslice1. Его длина увеличивается с 6 до 8, а ёмкость растёт, чтобы освободить место:

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

Синтаксис

main.go
slice_name = append(slice_name, element1, element2, ...)

Добавление одного slice к другому

append() может также добавить целый slice в конец другого, как показывает синтаксис.

Примечание: Три точки после slice2 обязательны. Они указывают Go передавать элементы slice по одному.

Пример

Значения myslice2 идут после значений myslice1, а объединённый результат попадает в myslice3:

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

Синтаксис

main.go
slice3 = append(slice1, slice2...)

Изменение длины slice

Длина массива фиксирована, а длина slice может меняться.

Пример

myslice1 сначала охватывает четыре элемента arr1, затем его повторно нарезают до двух. Добавление четырёх значений увеличивает его до шести, что превышает его ёмкость 5, поэтому ёмкость тоже растёт:

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

Эффективность использования памяти

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

Поэтому, когда массив большой, а вам нужно лишь несколько его элементов, лучше скопировать их с помощью функции copy().

Скопируйте их в новый slice, и этот slice получит собственный базовый массив, содержащий только то, что вам нужно. Тогда ваша программа будет использовать меньше памяти.

Пример

numbers содержит 15 значений, но нужны только первые 5. Они копируются в numbersCopy, созданный с помощью make(), длина и ёмкость которого равны всего 5:

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

Синтаксис

copy() принимает два slice — приёмник dest и источник src — и копирует данные из источника в приёмник. Её возвращаемое значение сообщает, сколько элементов было скопировано.

main.go
copy(dest, src)