Создание множества
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 32 из 68.
Теперь, когда вы понимаете концепцию идиомы множества (set) в Go, пришло время применить её на практике, создав своё первое множество. Этот процесс прост и следует тем же паттернам, которые вы уже изучили при работе с картами (maps).
Чтобы создать множество в Go, вы объявляете переменную, используя паттерн map[T]struct{}, где T — это тип элементов, которые вы хотите хранить. Вот как создать множество для хранения уникальных названий цветов:
colors := make(map[string]struct{})Вы также можете инициализировать множество начальными значениями, используя синтаксис литерала map:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Обратите внимание, что каждое значение является пустым литералом структуры {}. Это создает нулевое значение struct{}, которое не занимает места в памяти, при этом позволяя ключу существовать в map.
Прелесть этого подхода заключается в том, что он использует существующую инфраструктуру map в Go, обеспечивая при этом истинную семантику множеств (set) — каждое название цвета может встретиться только один раз, и вы получаете высокую скорость поиска, как и в случае с обычными картами (maps).
Задание
ЛегкоСоздайте трекер предпочтений языков программирования, который демонстрирует идиому множества (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 обеспечивает эффективный способ отслеживания уникальных элементов и предотвращения дубликатов в ваших данных.
Попробуйте сами
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, ",")
// Создание множества (set) с использованием идиомы 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:")
// Преобразовать map в slice и отсортировать для согласованного вывода
// Вывести каждый язык в формате "- [language]"
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей