Добавление в множество
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 33 из 68.
Теперь, когда у тебя создано множество, следующий шаг — научиться добавлять в него элементы. Поскольку множество в Go на самом деле представляет собой map, добавление элемента во множество идентично добавлению ключа в map.
Чтобы добавить элемент в ваше множество, просто присвойте пустое значение структуры новому ключу:
colors["yellow"] = struct{}{}Синтаксис struct{}{} создаёт пустой литерал структуры. Первый struct{} задаёт тип, а второй {} инициализирует его. Это стандартный способ добавлять элементы в множество в Go.
Преимущество этого подхода заключается в том, что при попытке снова добавить тот же элемент он просто перезаписывает существующую запись, сохраняя свойство уникальности множества.
Обратите внимание, что struct{}{} — единственный допустимый синтаксис для этого присваивания: запись только {} без имени типа вызывает ошибку компиляции: missing type in composite literal. Тип всегда должен быть явно указан при присваивании значения ключу карты вне литерала карты.
Добавление элементов в множество выполняется быстро и просто благодаря эффективной реализации map в Go, обеспечивая при этом настоящее поведение множества для отслеживания уникальных items.
Задание
ЛегкоСоздайте систему отслеживания навыков, которая управляет техническими способностями разработчика с использованием идиомы множества в Go. В этом задании демонстрируется добавление новых навыков в множество с предотвращением дубликатов и отслеживанием прогресса обучения.
Вы получите два входных значения:
- Строку, представляющую ожидаемое количество навыков (например,
"5") — используется только для справки - Строку, содержащую навыки, разделённые запятыми (например,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Ваша задача:
- Создать множество с использованием идиомы Go
map[string]struct{}для хранения уникальных технических навыков - Initialize множество тремя начальными навыками:
"Programming","Problem Solving"и"Communication" - Разобрать входную строку, разделив её по запятым, чтобы получить отдельные названия навыков
- Обработать ALL навыки из строки, разделённой запятыми (пройти по всему срезу, не используя параметр count)
- Для каждого навыка из входных данных добавить его в множество, используя
struct{}{}в качестве значения - Отобразить результаты обработки, выводя каждый навык по мере его обработки:
- Если навык новый для множества:
"Learning new skill: [skill]" - Если навык уже существует в множестве:
"Already mastered: [skill]"
- Если навык новый для множества:
- После обработки всех навыков отобразить сводку прогресса:
"Skills processed: [total_processed]"— использовать длину среза навыков"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Наконец, перечислить все навыки в наборе навыков разработчика:
- Заголовок:
"Complete skill set:" - Каждый навык на отдельной строке:
"✓ [skill]"
- Заголовок:
Важно: Используйте range, чтобы пройти по всем навыкам в срезе, а не параметр count. count предоставляется для справки, но не должен управлять вашим циклом. Используйте пакет strings, чтобы разделить входную строку. Чтобы проверить, существует ли навык, прежде чем добавлять его, используйте идиому comma ok: _, exists := skillSet[skill]. Это задание демонстрирует, как добавление элементов в множество Go автоматически обеспечивает уникальность, одновременно предоставляя высокую скорость поиска при проверке принадлежности.
Попробуйте сами
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Прочитать ввод
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Преобразовать строку count в целое число (только для справки — не используется в цикле)
_, _ = strconv.Atoi(countStr)
// Инициализировать набор навыков начальными навыками
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Разделить строку skills на отдельные навыки
skills := strings.Split(skillsStr, ",")
// TODO: Напишите ваш код ниже
// Обработать каждый навык, используя range для итерации по ВСЕМ навыкам в срезе
// Использовать идиому comma ok: _, exists := skillSet[skill]
// Добавлять новые навыки с помощью: skillSet[skill] = struct{}{}
// Отобразить результаты обработки для каждого навыка
// Вычислить и отобразить сводку прогресса, используя len(skills)
// List all skills in the complete skill set (consider sorting for consistent output)
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователейПотренируйтесь самостоятельно: Онлайн-компилятор Go