Идиома множества в Go
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 31 из 68.
В Go нет встроенной структуры данных «множество» (set), как во многих других языках программирования. Однако разработчики на Go нашли элегантное решение, используя map для имитации множеств, и этот паттерн стал настолько распространенным, что считается идиоматичным для Go.
Идиома множества (set) в Go использует карту (map), где важны только ключи, а не значения. Поскольку в качестве значения нужно что-то хранить, программисты на Go используют пустую структуру struct{}. Вот базовый шаблон:
var mySet map[string]struct{}Пустая структура struct{} особенная, потому что она занимает ноль байт памяти. Это делает её идеальной для множеств, где вам нужно только отслеживать, существует ли что-то или нет, не тратя память на бессмысленные значения.
Этот подход использует фундаментальное свойство ключей карты: они должны быть уникальными. Когда вы добавляете элемент в свое множество, вы на самом деле добавляете ключ в карту. Уникальность автоматически обеспечивается поведением карты, что дает вам истинную семантику множества.
В следующих уроках вы узнаете, как создавать, изменять и работать с множествами, используя этот идиоматичный паттерн Go. Эта техника широко используется в кодовых базах Go для отслеживания уникальных элементов, реализации алгоритмов и решения задач, где требуется быстрая проверка на принадлежность.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Шпаргалка
В Go нет встроенной структуры данных "множество" (set), но для имитации множеств используются карты (maps) с помощью идиоматического паттерна:
var mySet map[string]struct{}Пустая структура struct{} используется в качестве типа значения, так как она занимает ноль байт памяти. Ключи карты должны быть уникальными, что автоматически обеспечивает семантику множества для отслеживания уникальных элементов.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей