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

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

Инициализация среза

Существуют различные способы инициализации среза, и ниже приведены четыре способа, которые используются (см. Программу инициализации ниже): -

  1. Используя литералы: -

Как показано ниже, срез «a» был инициализирован литералами, и здесь мы не определяли какой-либо размер отдельно (как мы использовали для определения в массивах)

2. Инициализируя срез с помощью функции «make», функция make имеет синтаксис ниже: -

func make([]T, len, cap) []T

В случае, если параметр емкости не передан, емкость равна длине, как в примере ниже «b» срез инициализируется с помощью функции make, и, как мы видим в выводе программы, он имеет длину 3 и емкость 3

3. Инициализация слайса с параметрами емкости помогает заранее выделить память, которая нам может понадобиться при выполнении при работе с огромными данными. Для небольшого набора данных можно опустить емкость, но если мы заранее знаем, что данные будут огромными, тогда мы можем сохранить приблизительный размер памяти, выделенной заранее, выделение памяти (увеличение емкости) обычно будет дорогостоящим во время выполнения, будет обсудите дальнейшие операции, связанные с этим, в разделе компиляции.

В приведенном ниже примере мы видим, что срез «c» инициализируется длиной 3 и емкостью 100 (показано в выходных данных).

4. Срезы могут быть инициализированы / созданы с использованием «ссылки» на другой срез, как мы можем видеть в случае среза «d», он создается с помощью операции среза и указывает на нулевой элемент среза «a», здесь a [0: 1] означает элемент «до» индекса 1, но здесь мы должны помнить об одном: если мы изменим что-либо в срезе «a» или срезе «d», это отразится на обоих срезах «a» и «D», потому что он указывает на то же распределение памяти.

Вывод:-

Вывод :-

Расширения / операции среза

1. функция копирования

func copy(dst, src []T) int

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

Копировать пример

Вывод:-

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

Копировать (тот же фрагмент)

Вывод:-

В приведенном выше примере источник и назначение относятся к одному и тому же фрагменту, и когда мы применяем операцию копирования, оно перезаписывает исходное значение, как мы можем видеть в приведенной выше программе.

2. функция добавления

func append(s []T, x ...T) []T

Функция добавления расширяет, перераспределяя емкость (внутренне она повторно создает срез и копирует элементы, если емкость меньше для размещения нового элемента (ов)). Ниже мы увидим несколько примеров: -

Пример добавления: -

Вывод:-

Как мы можем видеть выше в приведенном выше примере, мы можем добавлять как одно, так и несколько значений в срез, и мы также добавляем срез, используя… (многоточие). Кроме того, мы должны увидеть, как это работает внутри, когда мы добавляем каждый раз.

Добавить (с подробностями адреса памяти)

Вывод:-

Выше показан пример, в котором мы проверяем детали адреса памяти после каждой операции, поэтому здесь мы можем ясно видеть, что после «первого» добавления емкость среза увеличивается вдвое от исходных элементов, а после второго добавления она увеличивается. не требует дальнейшего расширения емкости, так как он может вместить следующий элемент, и таким образом операция добавления просто добавляет элемент в конец (без операции копирования / воссоздания).

Резюме

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

Удачного кодирования!