Go 1.21: пакет slices

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

В версии Go 1.21, был добавлен новый пакет под названием slices. Этот пакет представляет собой набор функций, которые облегчают выполнение наиболее распространенных операций со слайсами. Пакет появился благодаря добавлению дженериков ранне в 1.18. Все функции в пакете являются обобщенными (или "generics").

Что такое generics?

Generics - это функции или типы, которые могут работать с любым типом данных. В Go generics были введены в версии 1.21 и они означают, что вы можете написать функцию, которая будет работать с любым типом данных, а не только с определенным.

Например, функция Delete из пакета slices выглядит так:

func Delete[S ~[]E, E any](s S, i, j int) S

Здесь S и E - это параметры типа. S представляет тип слайса, а E - тип элементов в этом слайсе. Тильда (~) означает, что S может быть любым типом, который может быть приведен к этому слайсу.

Например, если у вас есть следующие типы:

type MyType int
type MySlice []MyType

Вы можете использовать функции из пакета slices с объектами типа MySlice.

Функций пакета slices

Большая часть функций пакета имеет версии с приставкой Func, которые позволяют использовать свои функции. Это дает большую гибкость при работе со слайсами.

Например, функции Sort, IsSorted, Min, Max и BinarySearch могут быть применены к слайсам, элементы которых реализуют интерфейс Ordered. Этот интерфейс включает в себя все базовые числовые типы и строки, и типы которые могут быть приведены к ним.

type Ordered interface {
	~int | ~int8 | ~int16 | ~int64 |
		~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
		~float32 | ~float64 |
		~string
}

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

Equal и EqualFunc проверяют равенство двух срезов, сравнивая элементы напрямую или используя пользовательскую функцию равенства.

Compare и CompareFunc сравнивают два среза последовательно и возвращают <0, 0 или >0 в зависимости от того, меньше, равен или больше первый неравный элемент в s1 по отношению к соответствующему элементу в s2.

Index и IndexFunc возвращают индекс первого элемента, удовлетворяющего предикату, или -1, если ни один элемент не удовлетворяет.

Contains и ContainsFunc проверяют, соответствует ли значение или предикат любому элементу.

Insert эффективно O(len(s) + len(v)) вставляет элементы в срез на заданном индексе, расширяя срез при необходимости.

Delete и DeleteFunc удаляют элементы из среза по индексу или предикату.

Replace заменяет срез элементов на новые значения.

Особенности

Функция удаления Delete, в пакете, достаточно простая:

func Delete[S ~[]E, E any](s S, i, j int) S {
	_ = s[i:j] // bounds check
return append(s[:i], s[j:]...)

}

Такой подход имеет недостаток. После удаления объекты могут оставаться в исходном массиве, и garbage collector не удалить их из памяти. Также новый slice будет иметь capacity равный исходному слайсу.

slices.Delete([]int{1, 2, 3, 4, 5, 6}, 2, 3)
slices.Delete([]int{1, 2, 3, 4, 5, 6}, 2, 3)

Функция Clip, уменьшает capacity слайса до его текущей длины.

func Clip[S ~[]E, E any](s S) S {
	return s[:len(s):len(s)]
}

Такой функционал для слайсов появился в Go начиная с версии 1.2 когда ввели Full slice expression.

Full slice expression a[low : high : max]

Simple slice expression a[low : high]

Источник: https://habr.com/ru/articles/769056/


Интересные статьи

Интересные статьи

Cosmopolitan Libc предоставляет набор отладочных возможностей, повышающих удобство разработки на C: трассировка вызовов функций, интеграция с gdb, среда выполнения ASAN/UBSAN и многое другое! На C нап...
В связи со сложившейся мировой обстановкой, иностранные производители межсетевых экранов ушли с российского рынка, а использование уже эксплуатируемых остается под вопросом. Если вы тот самый специали...
Расскажу про эволюцию формата зашифрованных пакетов в store-and-forward утилитах NNCP, о которых я уже писал на Хабре. Что может быть проще, чем передать пакет данных в зашифрованном виде? Но всё возн...
Всем доброго времени суток. В рамках импортозамещения или точнее ухода от MS Office, на работе, возникла необходимость в рассмотрении российиских аналогов офисных пакетов и пакета LibreOffice, т.к. он...
В пакете логирования Go нет уровней логирования, вам нужно вручную добавлять префиксы, такие как отладка, информация, предупреждение и ошибка, самостоятельно. Кроме того, у типа логгера Go нет возмож...