0Pricing
Go Academy · Урок

Использование map как множества

Используйте map для хранения уникальных значений

«Использование map как множества» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

В Go нет типа множества

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

Отображение логических значений

Один из вариантов — map[string]bool. Наличие ключа (и значение true) означает, что элемент входит в множество.

package main

import "fmt"

func main() {
	set := map[string]bool{}
	set["apple"] = true
	set["banana"] = true
	fmt.Println(set)
}

Проверка принадлежности

Для проверки принадлежности используйте идиому с двумя результатами или непосредственно прочитайте логическое значение.

package main

import "fmt"

func main() {
	set := map[string]bool{"apple": true}
	fmt.Println(set["apple"])
	fmt.Println(set["cherry"])
}

Отображение пустых структур

Более экономичное по памяти множество использует map[string]struct{}. Пустая структура занимает ноль байт, поэтому Вы храните только ключи.

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["x"] = struct{}{}
	_, ok := set["x"]
	fmt.Println("x in set:", ok)
}

Зачем нужна пустая структура

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

Добавление элементов

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

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["a"] = struct{}{}
	set["a"] = struct{}{}
	fmt.Println("size:", len(set))
}

Удаление дубликатов

Классический пример использования — удаление дубликатов из среза. Добавьте каждый элемент в множество, а затем получите обратно уникальные ключи.

package main

import "fmt"

func main() {
	input := []string{"a", "b", "a", "c", "b"}
	set := map[string]struct{}{}
	for _, v := range input {
		set[v] = struct{}{}
	}
	fmt.Println("unique count:", len(set))
}

Создание среза уникальных элементов

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

package main

import "fmt"

func main() {
	input := []int{1, 2, 1, 3, 2}
	seen := map[int]struct{}{}
	result := []int{}
	for _, v := range input {
		if _, ok := seen[v]; !ok {
			seen[v] = struct{}{}
			result = append(result, v)
		}
	}
	fmt.Println(result)
}

Пересечение множеств

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

package main

import "fmt"

func main() {
	a := map[int]struct{}{1: {}, 2: {}, 3: {}}
	b := map[int]struct{}{2: {}, 3: {}, 4: {}}
	for k := range a {
		if _, ok := b[k]; ok {
			fmt.Println("common:", k)
		}
	}
}

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

Используйте delete, чтобы удалить элемент из множества.

package main

import "fmt"

func main() {
	set := map[string]struct{}{"a": {}, "b": {}}
	delete(set, "a")
	_, ok := set["a"]
	fmt.Println("a in set:", ok)
}

Выбор логического значения или пустой структуры

Подходят оба варианта. Используйте map[T]bool, когда удобство чтения выражения set[x] как логического значения помогает. Используйте map[T]struct{}, когда хотите явно показать, что значение не имеет значения, и сэкономить память в больших множествах.

Быстрая проверка

Почему для множеств часто предпочитают map[string]struct{}, а не map[string]bool?

Итоги

Отображения как множества:

  • в Go нет типа множества; используйте отображение с элементами в качестве ключей
  • map[T]bool или map[T]struct{}
  • отлично подходят для удаления дубликатов и проверки принадлежности

Часто задаваемые вопросы

Урок «Использование map как множества» бесплатный?

Да — полный текст урока «Использование map как множества» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Использование map как множества»?

Используйте map для хранения уникальных значений Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

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

Сколько времени занимает урок «Использование map как множества»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Внутреннее устройство map
  2. Проверка существования
  3. Использование map как множества
  4. Итерация и порядок
← Назад к Go Academy