Зарегистрируйтесь, чтобы продолжить обучение

Множественные операции над слайсами Основы Go

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

Библиотека lo — это популярный набор утилит для работы со срезами и другими структурами данных в Go. Она дополняет возможности стандартной библиотеки, предоставляя функции высокого уровня, которых нет в slices. Мы используем её для упрощения написания кода и повышения читаемости, особенно для таких операций, как объединение или пересечение срезов.

Проверка вхождения элемента

Для проверки наличия элемента в срезе используем slices.Contains():

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{1, 2, 3}
    fmt.Println(slices.Contains(nums, 2)) // => true
    fmt.Println(slices.Contains(nums, 5)) // => false
}

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

Удалить дубликаты можно с помощью slices.Compact(), но только для отсортированных данных. Если порядок элементов важен, используем lo.Uniq():

import "github.com/samber/lo"

nums := []int{2, 1, 2, 3, 1}
unique := lo.Uniq(nums)
fmt.Println(unique) // => [2 1 3]

Объединение (union)

Стандартный пакет slices не предоставляет функции объединения, поэтому используем lo.Union():

a := []int{1, 2, 3}
b := []int{3, 4, 5}

all := lo.Union(a, b)
fmt.Println(all) // => [1 2 3 4 5]

Пересечение (intersection)

Для пересечения тоже используем lo.Intersect:

a := []int{1, 2, 3}
b := []int{2, 3, 4}

common := lo.Intersect(a, b)
fmt.Println(common) // => [2 3]

Разность (difference)

Разность множеств можно вычислить через lo.Difference():

a := []int{1, 2, 3}
b := []int{2, 4}

onlyA, _ := lo.Difference(a, b)
fmt.Println(onlyA) // => [1 3]

Симметрическая разность

Симметрическая разность — это элементы, которые есть в одном из срезов, но не в обоих. Её можно получить через lo.Difference(), комбинируя оба результата:

a := []int{1, 2, 3}
b := []int{2, 4}

onlyA, onlyB := lo.Difference(a, b)
symDiff := append(onlyA, onlyB...)
fmt.Println(symDiff) // => [1 3 4]

Вывод

Используя пакет slices для базовых операций и lo для более продвинутых функций (объединение, пересечение, разность), можно работать со срезами в Go так же удобно, как с множествами в других языках.


Дополнительные материалы

  1. Slice types
  2. lo — библиотека для создания множеств в Go и не только

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff