Найти тему
Golang с 0

Go (Golang) с нуля. Урок 8 - Срезы (slice)

Оглавление

Узнаем как создавать срез. Это очень важная структура данных. В нем можно хранить несколько элементов одного типа и добавлять новые если потребуется.

Уроки по Go | Golang с 0 | Дзен

В предыдущем уроке мы познакомились с массивами, и как они помогают хранить ряд элементов одного типа. Выяснили, что массивы обладают рядом недостатков. Один из существенных:

В массив нельзя добавлять новые элементы

Срезы решают эту проблему.

Важная информация

Некоторые факты о срезах, которые могут пригодиться на собеседованиях.

  1. Срез — это структура (структуры рассмотрим в следующем уроке)
  2. В срез можно добавлять новые элементы
  3. Срез обладает двумя основными характеристиками — длина (len) и емкость (cap)
  4. Реализация среза использует внутри ссылку на массив
  5. Емкость среза увеличивается в несколько раз, если длины среза не хватает для добавления нового элемента
  6. Из среза нельзя удалить элемент

Создание

Операция объявления среза похожа на объявление массива, но нам не нужно указывать длину заранее.

Возьмем наш пример из предыдущего урока. В нем мы рассматривали улицу и дома на ней.

-2

Обратите внимание, что на строке 8 в квадратных скобках мы не указываем цифру для длины. Срез имеет динамическую длину, которая увеличивается при добавлении новых элементов. Начало отсчета элементов в срезе, так же как и у массивов начинаются с 0.

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

Свершилось чудо и на улице построили новый дом!

Нам необходимо отразить этот факт в срезе.

В этом нам поможет операция append.

-3

При запуске программы она выведет:

[1 2 3 4]

В срезе появился новый элемент с номером 4.

Важно запомнить, что функция append должна присвоить свой результат тому срезу, в который мы добавляем новые элементы. Если не использовать возвращаемое значение, компилятор будет выдавать ошибку.

Если забудем присвоить значение из функции append, компилятор скажет нам об этом
Если забудем присвоить значение из функции append, компилятор скажет нам об этом

Чтение и изменение элементов

Срез позволяет найти по индексу нужный элемент, также как массив.

street[1]

Берем дом по индексу 1.

Срез позволяет изменить значение элемента по индексу.

street[1] = 100

Меняем номер дома для индекса 1.

Цикл

Для массивов мы рассматривали операцию for range. Для среза этот подход тоже работает.

-5

Программа выводит позицию элемента через index и номер дома через переменную house.

Для каждого элемента в срезе, тело цикла отрабатывает один раз и выполняет код на строках 12-14.

Если нужны только номера домов, то название переменной index нужно заменить на нижнее подчеркивание. Так мы говорим Go, что нам неинтересно значение это переменной.

-6

На строке номер 11 название переменной index заменено на знак _.

Операция среза

Срез не просто так получил свое название.

У массива есть еще одна секретная операция!

Она называется операцией среза (slicing). Выглядит она следующим образом:

Выводим дома с первого по предпоследний (считаем по индексам, а не номерам домов)
Выводим дома с первого по предпоследний (считаем по индексам, а не номерам домов)

На девятой строке, мы в квадратных скобках получаем часть от исходного массива street. Как будто срезаем кусок, начиная с 1 индекса и заканчиваем 5, но его не включаем. Запомните этот важный момент.

Правая часть берется не включительно

Операция среза возвращает новый срез, построенный на основе исходного массива.

len

Последняя операция, которую можно применять на практике — это функция получения длины среза.

len(street)

Для нашего примера эта функция возвратит число 5, так как на улице расположено 5 домов.

Срезы — очень мощный инструмент разработчика. Но он обладает рядом интересных особенностей, которые мы рассмотрим в одном из следующих уроков.

Практика

Переходи по ссылке и пройди практику по данному уроку в обучающей онлайн — платформе Stepik.

Срезы

В следующем уроке познакомимся со структурами.

До новых встреч!