β

Как стать автором
Курсы по фронтенду
Посмотри в Календарь, вдруг сегодня есть мероприятие?

Моя лентаВсе потоки

Razzer 22 окт 2023 в 05:48

Go 1.21: пакет slices

Простой

2 мин

7.8K

Go*

Обзор

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

Что такое generics?

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

Например, функция 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)

Функция 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]

Теги:

golang

go 1.21

slices

Хабы:

Go

+6

26

8
+8

6

Карма

0

Рейтинг

@Razzer

Пользователь

Подписаться

Комментарии 8
+8

Публикации

Лучшие за суткиПохожие

A_Tsymbalyuk 13 часов назад

Физика ошибок не прощает. Она догонит тебя на крыше и заставит платить (дважды)

Простой

6 мин

8.1K

Кейс

+40

36

25
+25

BabayMazay 12 часов назад

Самодельные французские радиолампы 1920 г. Часть 3. Разрядная трубка, лампа накаливания

Средний

9 мин

1.5K

Ретроспектива

+33

9

11
+11

Bright_Translate 8 часов назад

Как я от нечего делать замедлил Postgres в 42 000 раз

Средний

11 мин

2.6K

Кейс

Перевод

+27

19

2
+2

lokosst 12 часов назад

Выделенные серверы + Kubernetes: практическое руководство

17 мин

2.4K

Туториал

+21

23

0

butivskiydm 11 часов назад

Моё мини-исследование про продолжительность жизни в России

Простой

2 мин

6.3K

Мнение

+19

17

59
+59

JetHabr 11 часов назад

«Плохие парни работают просто»: пентестеры разбирают реальные кейсы

Средний

9 мин

2.1K

Кейс

+17

19

1
+1

k0mar0v 14 часов назад

HTC Desire HD: история, дизайн и возможности легендарного смартфона

6 мин

2.6K

+17

5

5
+5

MaFrance351 13 часов назад

Домофон Лидер-М. Как скрестить трубку с ключом и всем проиграть

Простой

4 мин

2.5K

+16

5

6
+6

psygalaxy 13 часов назад

Как мы ускорили проверку документации с помощью AI-агента: от боли к решению

Средний

25 мин

1.7K

Обзор

+16

29

9
+9

kubelet 16 часов назад

DNS-хаос, зомби-поды и майнеры в кластере: самые невероятные случаи при работе с Kubernetes

Простой

14 мин

1.2K

Кейс

+16

22

1
+1

AI и майндсет айтишников — выясняем, как изменились IT-работодатели за год
Турбо

Показать еще

Минуточку внимания

Промо

Неважно, что ты выберешь — с Промокодусом будет дешевле

Событие

Что ни день – то ивент, если следить за Календарём

Событие

Как построить IT-бренд через вирусный контент и юмор

Читают сейчас

Как превратить ноутбук в полноценное рабочее место не хуже стационарного ПК

12K

71
+71

Нашел ЛЯП в игре 5букв от Т-банка, который позволяет со 100% вероятностью угадать скрытое слово

54K

115
+115

Как выйти из IT?.. и пойти слесарем на завод. Моя попыточка дауншифтинга [4\5]

1.4K

11
+11

Моё мини-исследование про продолжительность жизни в России

6.3K

59
+59

Роскомнадзор направил операторам связи РФ письма о необходимости удаления ПО Speedtest Ookla из своей IT-инфраструктуры

21K

100
+100

AI и майндсет айтишников — выясняем, как изменились IT-работодатели за год
Турбо

Истории

История Яндекс Почты

С Днём сисадмина!

Как расти в ИТ: советы, гайды и опыт сеньоров

1 055 450 очков в облаке – попробуй обогнать

Годнота из блогов компаний

Ближайшие события

7 августа

Мем-пати: как построить IT-бренд через вирусный контент и юмор

Москва

Больше событий в календаре

Маркетинг

13 августа

Как повысить эффективность врача в стоматологии на 25% с помощью ИИ?

Онлайн

Больше событий в календаре

Менеджмент

13 августа

Тест-драйв Хабра для маркетологов и пиарщиков

Москва

Больше событий в календаре

Маркетинг

16 августа

«ИТ-летник» — конференция от Совкомбанк Технологий

Казань

Больше событий в календаре

Разработка

Аналитика

3 сентября

«GoCloud Tech 2025» — IT-конференция про облака и AI

Москва • Онлайн

Больше событий в календаре

Разработка

18 – 19 сентября

Конференция по корпоративному онлайн-обучению iSpring Days 2025

Москва • Онлайн

Больше событий в календаре

Администрирование

Менеджмент

Другое

19 сентября

Премия для технологических стартапов Startech.Awards 2025

Москва • Онлайн

Больше событий в календаре

Другое

30 сентября

VII премия в сфере фармацевтического маркетинга и креатива MedMen Awards 2025

Онлайн

Больше событий в календаре

Маркетинг

Другое

30 октября

Премия «Проксима»

Москва

Больше событий в календаре

Маркетинг

Реклама

АО СЕЛЕКТЕЛ

ИНН 7810962785

erid: 2VSb5zDBFAH

1 000 000 стартапам

Кешбэк 30% на год в Selectel!

Ваш аккаунт

Профиль

Трекер

Диалоги

Настройки

ППА

Разделы

Статьи

Новости

Хабы

Компании

Авторы

Песочница

Информация

Устройство сайта

Для авторов

Для компаний

Документы

Соглашение

Конфиденциальность

Услуги

Корпоративный блог

Медийная реклама

Нативные проекты

Образовательные программы

Стартапам

Настройка языкаТехническая поддержка
© 2006–2025, Habr