Создание множества
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 32 из 68.
Теперь, когда вы понимаете концепцию идиомы множества (set) в Go, пришло время применить её на практике, создав своё первое множество. Этот процесс прост и следует тем же паттернам, которые вы уже изучили при работе с картами (maps).
Для создания множества в Go вы объявляете переменную, используя паттерн map[T]struct{}, где T — это тип элементов, которые вы хотите хранить. Вот как создать множество для хранения уникальных названий цветов:
colors := make(map[string]struct{})Вы также можете инициализировать множество начальными значениями, используя синтаксис литерала карты:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Обратите внимание, что каждое значение представляет собой пустой литерал структуры {}. Это создает нулевое значение struct{}, которое не занимает места в памяти, но при этом позволяет ключу существовать в карте.
Прелесть этого подхода заключается в том, что он использует существующую инфраструктуру map в Go, обеспечивая при этом истинную семантику set — каждое название цвета может появиться только один раз, и вы получаете высокую скорость поиска, как и в случае с обычными map.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте трекер предпочтений языков программирования, который демонстрирует идиому множества (set) в Go для хранения уникальных элементов. Эта задача показывает, как использовать паттерн map[string]struct{} для отслеживания языков программирования без дубликатов.
Вы получите два входных значения:
- Строку, представляющую количество языков для обработки (например,
"6") - Строку, содержащую названия языков программирования, разделенные запятыми (например,
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Ваша задача:
- Создать множество, используя идиому Go
map[string]struct{}, для хранения уникальных языков программирования - Разобрать входную строку, разделив ее по запятым, чтобы получить названия отдельных языков
- Добавить каждый язык в ваше множество, используя литерал пустой структуры
{}в качестве значения - Отобразить результаты обработки, выводя каждый язык по мере его появления:
- Если язык является новым для множества:
"Added: [language]" - Если язык уже существует в множестве:
"Already exists: [language]"
- Если язык является новым для множества:
- После обработки всех языков вывести сводку:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Наконец, перечислить все уникальные языки в множестве:
- Заголовок:
"Programming languages in set:" - Каждый язык на отдельной строке:
"- [language]"
- Заголовок:
Используйте пакет strings для разделения входной строки и пакет strconv для преобразования строки с количеством в целое число. Чтобы проверить, существует ли язык в множестве перед его добавлением, используйте идиому comma ok: _, exists := languageSet[language]. Эта задача демонстрирует, как идиома множества в Go обеспечивает эффективный способ отслеживания уникальных элементов и предотвращения дубликатов в ваших данных.
Шпаргалка
Чтобы создать множество (set) в Go, используйте паттерн map[T]struct{}, где T — это тип элемента:
colors := make(map[string]struct{})Вы также можете инициализировать множество начальными значениями, используя синтаксис литерала карты:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Каждое значение представляет собой литерал пустой структуры {}, который создает нулевое значение struct{} и не занимает места в памяти, позволяя ключу существовать в карте.
Чтобы проверить, существует ли элемент в множестве, используйте идиому "comma ok":
_, exists := languageSet[language]Попробуйте сами
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Чтение входных данных
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Преобразование строки количества в целое число (не требуется для этой задачи)
_, _ = strconv.Atoi(countStr)
// Разделение строки языков по запятым
languages := strings.Split(languagesStr, ",")
// Создание множества с использованием идиомы map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Напишите свой код ниже
// Обработка каждого языка и проверка его наличия в множестве
// Использование идиомы comma ok: _, exists := languageSet[language]
// Вывод "Added: [language]" или "Already exists: [language]"
// Добавление языков в множество с использованием литерала пустой структуры {}
// Вывод сводной информации
// Вывод общего количества обработанных языков и количества уникальных языков
// Вывод всех уникальных языков в множестве
fmt.Println("Programming languages in set:")
// Преобразование карты в срез и сортировка для согласованного вывода
// Список каждого языка в формате "- [language]"
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей