Menu
Coddy logo textTech

Создание множества

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

Теперь, когда вы понимаете концепцию идиомы множества (set) в Go, пришло время применить её на практике, создав своё первое множество. Этот процесс прост и следует тем же паттернам, которые вы уже изучили при работе с картами (maps).

Для создания множества в Go вы объявляете переменную, используя паттерн map[T]struct{}, где T — это тип элементов, которые вы хотите хранить. Вот как создать множество для хранения уникальных названий цветов:

colors := make(map[string]struct{})

Вы также можете инициализировать множество начальными значениями, используя синтаксис литерала карты:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

Обратите внимание, что каждое значение представляет собой пустой литерал структуры {}. Это создает нулевое значение struct{}, которое не занимает места в памяти, но при этом позволяет ключу существовать в карте.

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

challenge icon

Задание

Легко

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

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

  • Строку, представляющую количество языков для обработки (например, "6")
  • Строку, содержащую названия языков программирования, разделенные запятыми (например, "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

Ваша задача:

  1. Создать множество, используя идиому Go map[string]struct{}, для хранения уникальных языков программирования
  2. Разобрать входную строку, разделив ее по запятым, чтобы получить названия отдельных языков
  3. Добавить каждый язык в ваше множество, используя литерал пустой структуры {} в качестве значения
  4. Отобразить результаты обработки, выводя каждый язык по мере его появления:
    • Если язык является новым для множества: "Added: [language]"
    • Если язык уже существует в множестве: "Already exists: [language]"
  5. После обработки всех языков вывести сводку:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. Наконец, перечислить все уникальные языки в множестве:
    • Заголовок: "Programming languages in set:"
    • Каждый язык на отдельной строке: "- [language]"

Используйте пакет strings для разделения входной строки и пакет strconv для преобразования строки с количеством в целое число. Чтобы проверить, существует ли язык в множестве перед его добавлением, используйте идиому comma ok: _, exists := languageSet[language]. Эта задача демонстрирует, как идиома множества в Go обеспечивает эффективный способ отслеживания уникальных элементов и предотвращения дубликатов в ваших данных.

Шпаргалка

Чтобы создать множество (set) в Go, используйте паттерн map[T]struct{}, где T — это тип элемента:

colors := make(map[string]struct{})

Вы также можете инициализировать множество начальными значениями, используя синтаксис литерала карты:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

Каждое значение представляет собой литерал пустой структуры {}, который создает нулевое значение struct{} и не занимает места в памяти, позволяя ключу существовать в карте.

Чтобы проверить, существует ли элемент в множестве, используйте идиому "comma ok":

_, exists := languageSet[language]

Попробуйте сами

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, ",")
	
	// Создание множества с использованием идиомы 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:")
	// Преобразование карты в срез и сортировка для согласованного вывода
	// Список каждого языка в формате "- [language]"
}
quiz iconПроверьте себя

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

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