Использование 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 — локальная установка не требуется.
Все уроки этого курса
- Внутреннее устройство map
- Проверка существования
- Использование map как множества
- Итерация и порядок