Menu
Coddy logo textTech

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

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

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

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

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

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

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

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

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

challenge icon

Задание

Легко

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

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

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

Ваша задача:

  1. Создать множество, используя идиому Go map[string]struct{}, для хранения уникальных технических навыков
  2. Инициализировать множество тремя начальными навыками: "Programming", "Problem Solving" и "Communication"
  3. Разобрать входную строку, разделив ее по запятым, чтобы получить названия отдельных навыков
  4. Обработать ВСЕ навыки из строки с разделителями-запятыми (итерируйте по всему срезу, не используя параметр количества)
  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 для итерации по всем навыкам в срезе, а не параметр количества. Количество предоставлено для справки, но не должно управлять вашим циклом. Используйте пакет 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)
	
	// Преобразовать строку количества в целое число (только для справки — не используется в цикле)
	_, _ = 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)
	// Вывести список всех навыков в полном наборе навыков (рассмотрите возможность сортировки для согласованного вывода)
	
}
quiz iconПроверьте себя

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

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