Menu
Coddy logo textTech

Добавление в множество

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 33 из 68.

Теперь, когда у тебя создано множество, следующий шаг — научиться добавлять в него элементы. Поскольку множество в Go на самом деле представляет собой map, добавление элемента во множество идентично добавлению ключа в map.

Чтобы добавить элемент в ваше множество, просто присвойте пустое значение структуры новому ключу:

colors["yellow"] = struct{}{}

Синтаксис struct{}{} создаёт пустой литерал структуры. Первый struct{} задаёт тип, а второй {} инициализирует его. Это стандартный способ добавлять элементы в множество в Go.

Преимущество этого подхода заключается в том, что при попытке снова добавить тот же элемент он просто перезаписывает существующую запись, сохраняя свойство уникальности множества.

Обратите внимание, что struct{}{} — единственный допустимый синтаксис для этого присваивания: запись только {} без имени типа вызывает ошибку компиляции: missing type in composite literal. Тип всегда должен быть явно указан при присваивании значения ключу карты вне литерала карты.

Добавление элементов в множество выполняется быстро и просто благодаря эффективной реализации map в Go, обеспечивая при этом настоящее поведение множества для отслеживания уникальных items.

challenge icon

Задание

Легко

Создайте систему отслеживания навыков, которая управляет техническими способностями разработчика с использованием идиомы множества в Go. В этом задании демонстрируется добавление новых навыков в множество с предотвращением дубликатов и отслеживанием прогресса обучения.

Вы получите два входных значения:

  • Строку, представляющую ожидаемое количество навыков (например, "5") — используется только для справки
  • Строку, содержащую навыки, разделённые запятыми (например, "Go,Docker,Kubernetes,Go,React,Docker,Python")

Ваша задача:

  1. Создать множество с использованием идиомы Go map[string]struct{} для хранения уникальных технических навыков
  2. Initialize множество тремя начальными навыками: "Programming", "Problem Solving" и "Communication"
  3. Разобрать входную строку, разделив её по запятым, чтобы получить отдельные названия навыков
  4. Обработать ALL навыки из строки, разделённой запятыми (пройти по всему срезу, не используя параметр count)
  5. Для каждого навыка из входных данных добавить его в множество, используя struct{}{} в качестве значения
  6. Отобразить результаты обработки, выводя каждый навык по мере его обработки:
    • Если навык новый для множества: "Learning new skill: [skill]"
    • Если навык уже существует в множестве: "Already mastered: [skill]"
  7. После обработки всех навыков отобразить сводку прогресса:
    • "Skills processed: [total_processed]" — использовать длину среза навыков
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. Наконец, перечислить все навыки в наборе навыков разработчика:
    • Заголовок: "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)
	
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go