Добавление в множество
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 33 из 68.
Теперь, когда вы создали множество, следующим шагом будет изучение того, как добавлять в него элементы. Поскольку множество в Go на самом деле является картой (map) внутри, добавление элемента в множество идентично добавлению ключа в карту.
Чтобы добавить элемент в ваше множество, вы просто присваиваете значение пустой структуры новому ключу:
colors["yellow"] = struct{}{}Синтаксис struct{}{} создает пустой литерал структуры. Первая часть struct{} указывает тип, а вторая {} инициализирует его. Это стандартный способ добавления элементов в набор (set) в Go.
Прелесть этого подхода заключается в том, что если вы попытаетесь добавить тот же элемент снова, он просто перезапишет существующую запись, сохраняя свойство уникальности набора.
Обратите внимание, что struct{}{} — это единственный допустимый синтаксис для этого присваивания; написание просто {} без указания имени типа приводит к ошибке компиляции: missing type in composite literal. Тип всегда должен быть указан явно при присваивании значения ключу карты вне литерала карты.
Добавление элементов в множество происходит быстро и просто, используя эффективную реализацию map в Go и обеспечивая при этом истинное поведение множества для отслеживания уникальных элементов.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте систему отслеживания навыков, которая управляет техническими способностями разработчика, используя идиому множества (set) в Go. Эта задача демонстрирует, как добавлять новые навыки в множество, предотвращая дублирование и отслеживая прогресс обучения.
Вы получите два входных значения:
- Строку, представляющую ожидаемое количество навыков (например,
"5") — это только для справки - Строку, содержащую навыки, разделенные запятыми (например,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Ваша задача:
- Создать множество, используя идиому Go
map[string]struct{}, для хранения уникальных технических навыков - Инициализировать множество тремя начальными навыками:
"Programming","Problem Solving"и"Communication" - Разобрать входную строку, разделив ее по запятым, чтобы получить названия отдельных навыков
- Обработать ВСЕ навыки из строки с разделителями-запятыми (итерируйте по всему срезу, не используя параметр количества)
- Для каждого навыка из входных данных добавьте его в свое множество, используя
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 для итерации по всем навыкам в срезе, а не параметр количества. Количество предоставлено для справки, но не должно управлять вашим циклом. Используйте пакет strings для разделения входной строки. Чтобы проверить, существует ли навык перед его добавлением, используйте идиому comma ok: _, exists := skillSet[skill]. Эта задача демонстрирует, как добавление элементов в множество Go автоматически обеспечивает уникальность, обеспечивая при этом высокую производительность поиска для проверки членства.
Шпаргалка
Чтобы добавить элементы в Go set (реализованный как map[string]struct{}), присвойте пустую структуру новому ключу:
colors["yellow"] = struct{}{}Синтаксис struct{}{} создает литерал пустой структуры. Первая часть struct{} указывает тип, а вторая {} инициализирует его. Это стандартный способ добавления элементов в множество (set) в Go.
Попробуйте сами
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Чтение входных данных
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Преобразование строки количества в целое число (только для справки — не используется в цикле)
_, _ = strconv.Atoi(countStr)
// Инициализация набора навыков начальными навыками
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Разделение строки навыков на отдельные навыки
skills := strings.Split(skillsStr, ",")
// TODO: Напишите свой код ниже
// Обработайте каждый навык, используя range для итерации по ВСЕМ навыкам в срезе
// Используйте идиому comma ok: _, exists := skillSet[skill]
// Добавляйте новые навыки с помощью: skillSet[skill] = struct{}{}
// Выводите результаты обработки для каждого навыка
// Рассчитайте и выведите сводку прогресса, используя len(skills)
// Перечислите все навыки в полном наборе навыков (рассмотрите возможность сортировки для стабильного вывода)
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей