set

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 15, 2026 License: MIT Imports: 5 Imported by: 5

README

set

import "github.com/Compogo/types/set"

Package set предоставляет реализацию типобезопасного множества (Set) на основе хэш-таблицы. Множество поддерживает операции объединения, пересечения, разности и симметрической разности.

Index

type Set

Set представляет собой типобезопасное множество, реализованное на основе встроенной мапы (map[T]struct{}). Поддерживает все стандартные операции над множествами: добавление, удаление, проверку вхождения, объединение, пересечение, разность и симметрическую разность.

Нулевое значение Set является nil-множеством (пустым, но не выделенным). Большинство методов корректно работают с nil-получателем, возвращая пустые значения или выполняя операции без паники.

type Set[T comparable] map[T]struct{}

func NewSet
func NewSet[T comparable](items ...T) Set[T]

NewSet создает и возвращает новое множество, содержащее переданные элементы items. Если элементы не переданы, возвращается пустое выделенное множество.

Пример:

s := NewSet(1, 2, 3)
empty := NewSet[string]()

func (*Set[T]) Add
func (s *Set[T]) Add(items ...T)

Add добавляет один или несколько элементов в множество. Если items равен nil или длина слайса элементов равна 0, метод ничего не делает. При добавлении большого количества элементов (>= numberOfElementsToRecreate) автоматически выполняет реаллокацию для оптимизации производительности.

Пример:

s := NewSet[int]()
s.Add(1, 2, 3) // в s находятся {1, 2, 3}

func (*Set[T]) Clone
func (s *Set[T]) Clone() Set[T]

Clone возвращает глубокую копию множества. Для nil-множества возвращает пустое выделенное множество (не nil).

Пример:

original := NewSet(1, 2, 3)
copy := original.Clone() // copy содержит {1, 2, 3}, но является отдельным множеством

func (*Set[T]) Contains
func (s *Set[T]) Contains(item T) bool

Contains проверяет, содержится ли элемент item в множестве. Возвращает true, если элемент присутствует, и false в противном случае. Для nil-множества всегда возвращает false.

Пример:

s := NewSet(1, 2)
s.Contains(1) // true
s.Contains(3) // false

func (*Set[T]) ContainsAnd
func (s *Set[T]) ContainsAnd(items ...T) bool

ContainsAnd проверяет, содержатся ли ВСЕ элементы items в множестве. Возвращает true, только если каждый переданный элемент присутствует.

Пример:

s := NewSet(1, 2, 3)
s.ContainsAnd(1, 2) // true
s.ContainsAnd(1, 4) // false

func (*Set[T]) ContainsOr
func (s *Set[T]) ContainsOr(items ...T) bool

ContainsOr проверяет, содержится ли ХОТЯ БЫ ОДИН из элементов items в множестве. Возвращает true при первом же найденном элементе.

Пример:

s := NewSet(1, 2, 3)
s.ContainsOr(4, 5, 1) // true
s.ContainsOr(4, 5, 6) // false

func (*Set[T]) Difference
func (s *Set[T]) Difference(set Set[T]) Set[T]

Difference возвращает новое множество, содержащее элементы текущего множества, которые отсутствуют в множестве set (разность множеств: s \ set).

Пример:

a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
c := a.Difference(b) // c содержит {1}

func (*Set[T]) Equal
func (s *Set[T]) Equal(set Set[T]) bool

Equal проверяет, равны ли два множества (содержат одинаковые элементы). Два множества считаются равными, если они имеют одинаковый размер и каждый элемент одного множества содержится в другом. nil-множество считается равным пустому выделенному множеству.

Пример:

a := NewSet(1, 2, 3)
b := NewSet(3, 2, 1)
c := NewSet(1, 2)
a.Equal(b) // true
a.Equal(c) // false

func (*Set[T]) Filter
func (s *Set[T]) Filter(predicate func(T) bool) Set[T]

Filter возвращает новое множество, содержащее только те элементы текущего множества, для которых функция predicate возвращает true. Исходное множество не изменяется.

Пример:

s := NewSet(1, 2, 3, 4, 5)
evens := s.Filter(func(x int) bool { return x%2 == 0 }) // evens содержит {2, 4}

func (*Set[T]) Intersection
func (s *Set[T]) Intersection(set Set[T]) Set[T]

Intersection возвращает новое множество, содержащее элементы, присутствующие одновременно в текущем множестве и в множестве set. Операция выполняется итерацией по меньшему множеству для оптимальной производительности.

Пример:

a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
c := a.Intersection(b) // c содержит {2, 3

func (*Set[T]) Len
func (s *Set[T]) Len() int

Len возвращает количество элементов в множестве. Для nil-множества возвращает 0.

Пример:

s := NewSet(1, 2, 3)
s.Len() // 3

func (*Set[T]) MarshalJSON
func (s *Set[T]) MarshalJSON() ([]byte, error)

MarshalJSON реализует интерфейс json.Marshaler. Множество сериализуется в JSON-массив элементов. Для nil-множества возвращает "null".

Пример:

s := NewSet("a", "b")
data, _ := json.Marshal(s) // data равно ["a", "b"]

func (*Set[T]) Merge
func (s *Set[T]) Merge(set Set[T])

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

Пример:

a := NewSet(1, 2)
b := NewSet(2, 3)
a.Merge(b) // a содержит {1, 2, 3}

func (*Set[T]) Remove
func (s *Set[T]) Remove(item T)

Remove удаляет элемент item из множества. Если элемент отсутствует или множество nil, метод ничего не делает.

Пример:

s := NewSet(1, 2, 3)
s.Remove(2) // s содержит {1, 3}

func (*Set[T]) Replace
func (s *Set[T]) Replace(set Set[T])

Replace заменяет содержимое текущего множества на содержимое множества set. Текущее множество сначала очищается (Reset), а затем в него копируются все элементы из set. Полезно для обновления множества без создания нового объекта.

Пример:

s := NewSet(1, 2)
t := NewSet(3, 4)
s.Replace(t) // s теперь содержит {3, 4}

func (*Set[T]) Reset
func (s *Set[T]) Reset()

Reset очищает множество, удаляя все элементы. Если множество nil, оно инициализируется как пустое выделенное множество.

Пример:

s := NewSet(1, 2, 3)
s.Reset() // s теперь пусто

func (*Set[T]) Scan
func (s *Set[T]) Scan(value any) error

Scan реализует интерфейс sql.Scanner для чтения множества из базы данных. Поддерживает чтение JSON-массивов из колонок типов []byte или string.

func (*Set[T]) SymmetricDifference
func (s *Set[T]) SymmetricDifference(set Set[T]) Set[T]

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

Пример:

a := NewSet(1, 2, 3)
b := NewSet(3, 4, 5)
c := a.SymmetricDifference(b) // c содержит {1, 2, 4, 5}

func (*Set[T]) ToSlice
func (s *Set[T]) ToSlice() []T

ToSlice преобразует множество в срез (slice) типа []T. Порядок элементов не гарантируется (зависит от итерации по мапе). Для nil-множества возвращает nil.

Пример:

s := NewSet("a", "b", "c")
slice := s.ToSlice() // []string{"a", "b", "c"} в произвольном порядке

func (*Set[T]) Union
func (s *Set[T]) Union(set Set[T]) Set[T]

Union возвращает объединение текущего множества и множества set. Использует стратегию Optimization (см. UnionStrategy) для выбора оптимального способа. Эквивалентно вызову UnionByStrategy(s, set, Optimization).

Пример:

a := NewSet(1, 2)
b := NewSet(3, 4)
c := a.Union(b) // c содержит {1, 2, 3, 4}

func (*Set[T]) UnionByStrategy
func (s *Set[T]) UnionByStrategy(set Set[T], strategy UnionStrategy) Set[T]

UnionByStrategy возвращает объединение множеств с использованием указанной стратегии. Параметр strategy определяет, какое множество будет клонировано, а какое будет итерировано. Доступные стратегии: Optimization (умный выбор), CurrentSet (клонировать текущее), IncomingSet (клонировать входящее).

Пример:

a := NewSet(1, 2)
b := NewSet(3, 4)
c := a.UnionByStrategy(b, CurrentSet) // клонируется a, добавляются элементы b

func (*Set[T]) UnmarshalJSON
func (s *Set[T]) UnmarshalJSON(data []byte) error

UnmarshalJSON реализует интерфейс json.Unmarshaler. Десериализует JSON-массив в множество. Поддерживает null и пустые массивы.

Пример:

var s Set[int]
json.Unmarshal([]byte("[1,2,3]"), &s) // s содержит {1, 2, 3}

func (*Set[T]) Value
func (s *Set[T]) Value() (driver.Value, error)

Value реализует интерфейс driver.Valuer для использования с database/sql. Позволяет сохранять множество в базу данных как JSON-массив.

type UnionStrategy

UnionStrategy определяет стратегию слияния двух множеств.

type UnionStrategy uint8

Optimization определяет стратегию поведения при объединении множеств. Используется в функции UnionByStrategy.

const (
    // Optimization (значение по умолчанию) выбирает наиболее эффективную стратегию
    // в зависимости от размера множеств (клонируется меньшее множество).
    Optimization UnionStrategy = iota

    // CurrentSet при объединении клонирует исходное множество (CurrentSet)
    // и добавляет в него элементы входящего множества (IncomingSet).
    // Полезно, когда нужно сохранить приоритет элементов из текущего множества.
    CurrentSet

    // IncomingSet при объединении клонирует входящее множество (IncomingSet)
    // и добавляет в него элементы исходного множества (CurrentSet).
    // Полезно, когда входящее множество заведомо меньше или нужно сохранить его структуру.
    IncomingSet
)

Generated by gomarkdoc

Documentation

Overview

Package set предоставляет реализацию типобезопасного множества (Set) на основе хэш-таблицы. Множество поддерживает операции объединения, пересечения, разности и симметрической разности.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Set

type Set[T comparable] map[T]struct{}

Set представляет собой типобезопасное множество, реализованное на основе встроенной мапы (map[T]struct{}). Поддерживает все стандартные операции над множествами: добавление, удаление, проверку вхождения, объединение, пересечение, разность и симметрическую разность.

Нулевое значение Set является nil-множеством (пустым, но не выделенным). Большинство методов корректно работают с nil-получателем, возвращая пустые значения или выполняя операции без паники.

func NewSet

func NewSet[T comparable](items ...T) Set[T]

NewSet создает и возвращает новое множество, содержащее переданные элементы items. Если элементы не переданы, возвращается пустое выделенное множество.

Пример:

s := NewSet(1, 2, 3)
empty := NewSet[string]()

func (*Set[T]) Add

func (s *Set[T]) Add(items ...T)

Add добавляет один или несколько элементов в множество. Если items равен nil или длина слайса элементов равна 0, метод ничего не делает. При добавлении большого количества элементов (>= numberOfElementsToRecreate) автоматически выполняет реаллокацию для оптимизации производительности.

Пример:

s := NewSet[int]()
s.Add(1, 2, 3) // в s находятся {1, 2, 3}

func (*Set[T]) Clone

func (s *Set[T]) Clone() Set[T]

Clone возвращает глубокую копию множества. Для nil-множества возвращает пустое выделенное множество (не nil).

Пример:

original := NewSet(1, 2, 3)
copy := original.Clone() // copy содержит {1, 2, 3}, но является отдельным множеством

func (*Set[T]) Contains

func (s *Set[T]) Contains(item T) bool

Contains проверяет, содержится ли элемент item в множестве. Возвращает true, если элемент присутствует, и false в противном случае. Для nil-множества всегда возвращает false.

Пример:

s := NewSet(1, 2)
s.Contains(1) // true
s.Contains(3) // false

func (*Set[T]) ContainsAnd added in v1.0.0

func (s *Set[T]) ContainsAnd(items ...T) bool

ContainsAnd проверяет, содержатся ли ВСЕ элементы items в множестве. Возвращает true, только если каждый переданный элемент присутствует.

Пример:

s := NewSet(1, 2, 3)
s.ContainsAnd(1, 2) // true
s.ContainsAnd(1, 4) // false

func (*Set[T]) ContainsOr added in v1.0.0

func (s *Set[T]) ContainsOr(items ...T) bool

ContainsOr проверяет, содержится ли ХОТЯ БЫ ОДИН из элементов items в множестве. Возвращает true при первом же найденном элементе.

Пример:

s := NewSet(1, 2, 3)
s.ContainsOr(4, 5, 1) // true
s.ContainsOr(4, 5, 6) // false

func (*Set[T]) Difference added in v0.0.17

func (s *Set[T]) Difference(set Set[T]) Set[T]

Difference возвращает новое множество, содержащее элементы текущего множества, которые отсутствуют в множестве set (разность множеств: s \ set).

Пример:

a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
c := a.Difference(b) // c содержит {1}

func (*Set[T]) Equal added in v1.0.0

func (s *Set[T]) Equal(set Set[T]) bool

Equal проверяет, равны ли два множества (содержат одинаковые элементы). Два множества считаются равными, если они имеют одинаковый размер и каждый элемент одного множества содержится в другом. nil-множество считается равным пустому выделенному множеству.

Пример:

a := NewSet(1, 2, 3)
b := NewSet(3, 2, 1)
c := NewSet(1, 2)
a.Equal(b) // true
a.Equal(c) // false

func (*Set[T]) Filter added in v1.0.0

func (s *Set[T]) Filter(predicate func(T) bool) Set[T]

Filter возвращает новое множество, содержащее только те элементы текущего множества, для которых функция predicate возвращает true. Исходное множество не изменяется.

Пример:

s := NewSet(1, 2, 3, 4, 5)
evens := s.Filter(func(x int) bool { return x%2 == 0 }) // evens содержит {2, 4}

func (*Set[T]) Intersection added in v0.0.17

func (s *Set[T]) Intersection(set Set[T]) Set[T]

Intersection возвращает новое множество, содержащее элементы, присутствующие одновременно в текущем множестве и в множестве set. Операция выполняется итерацией по меньшему множеству для оптимальной производительности.

Пример:

a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
c := a.Intersection(b) // c содержит {2, 3

func (*Set[T]) Len

func (s *Set[T]) Len() int

Len возвращает количество элементов в множестве. Для nil-множества возвращает 0.

Пример:

s := NewSet(1, 2, 3)
s.Len() // 3

func (*Set[T]) MarshalJSON

func (s *Set[T]) MarshalJSON() ([]byte, error)

MarshalJSON реализует интерфейс json.Marshaler. Множество сериализуется в JSON-массив элементов. Для nil-множества возвращает "null".

Пример:

s := NewSet("a", "b")
data, _ := json.Marshal(s) // data равно ["a", "b"]

func (*Set[T]) Merge added in v1.0.0

func (s *Set[T]) Merge(set Set[T])

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

Пример:

a := NewSet(1, 2)
b := NewSet(2, 3)
a.Merge(b) // a содержит {1, 2, 3}

func (*Set[T]) Remove

func (s *Set[T]) Remove(item T)

Remove удаляет элемент item из множества. Если элемент отсутствует или множество nil, метод ничего не делает.

Пример:

s := NewSet(1, 2, 3)
s.Remove(2) // s содержит {1, 3}

func (*Set[T]) Replace added in v0.0.19

func (s *Set[T]) Replace(set Set[T])

Replace заменяет содержимое текущего множества на содержимое множества set. Текущее множество сначала очищается (Reset), а затем в него копируются все элементы из set. Полезно для обновления множества без создания нового объекта.

Пример:

s := NewSet(1, 2)
t := NewSet(3, 4)
s.Replace(t) // s теперь содержит {3, 4}

func (*Set[T]) Reset

func (s *Set[T]) Reset()

Reset очищает множество, удаляя все элементы. Если множество nil, оно инициализируется как пустое выделенное множество.

Пример:

s := NewSet(1, 2, 3)
s.Reset() // s теперь пусто

func (*Set[T]) Scan

func (s *Set[T]) Scan(value any) error

Scan реализует интерфейс sql.Scanner для чтения множества из базы данных. Поддерживает чтение JSON-массивов из колонок типов []byte или string.

func (*Set[T]) SymmetricDifference added in v1.0.0

func (s *Set[T]) SymmetricDifference(set Set[T]) Set[T]

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

Пример:

a := NewSet(1, 2, 3)
b := NewSet(3, 4, 5)
c := a.SymmetricDifference(b) // c содержит {1, 2, 4, 5}

func (*Set[T]) ToSlice

func (s *Set[T]) ToSlice() []T

ToSlice преобразует множество в срез (slice) типа []T. Порядок элементов не гарантируется (зависит от итерации по мапе). Для nil-множества возвращает nil.

Пример:

s := NewSet("a", "b", "c")
slice := s.ToSlice() // []string{"a", "b", "c"} в произвольном порядке

func (*Set[T]) Union added in v0.0.17

func (s *Set[T]) Union(set Set[T]) Set[T]

Union возвращает объединение текущего множества и множества set. Использует стратегию Optimization (см. UnionStrategy) для выбора оптимального способа. Эквивалентно вызову UnionByStrategy(s, set, Optimization).

Пример:

a := NewSet(1, 2)
b := NewSet(3, 4)
c := a.Union(b) // c содержит {1, 2, 3, 4}

func (*Set[T]) UnionByStrategy added in v0.0.18

func (s *Set[T]) UnionByStrategy(set Set[T], strategy UnionStrategy) Set[T]

UnionByStrategy возвращает объединение множеств с использованием указанной стратегии. Параметр strategy определяет, какое множество будет клонировано, а какое будет итерировано. Доступные стратегии: Optimization (умный выбор), CurrentSet (клонировать текущее), IncomingSet (клонировать входящее).

Пример:

a := NewSet(1, 2)
b := NewSet(3, 4)
c := a.UnionByStrategy(b, CurrentSet) // клонируется a, добавляются элементы b

func (*Set[T]) UnmarshalJSON

func (s *Set[T]) UnmarshalJSON(data []byte) error

UnmarshalJSON реализует интерфейс json.Unmarshaler. Десериализует JSON-массив в множество. Поддерживает null и пустые массивы.

Пример:

var s Set[int]
json.Unmarshal([]byte("[1,2,3]"), &s) // s содержит {1, 2, 3}

func (*Set[T]) Value

func (s *Set[T]) Value() (driver.Value, error)

Value реализует интерфейс driver.Valuer для использования с database/sql. Позволяет сохранять множество в базу данных как JSON-массив.

type UnionStrategy added in v1.0.0

type UnionStrategy uint8

UnionStrategy определяет стратегию слияния двух множеств.

const (
	// Optimization (значение по умолчанию) выбирает наиболее эффективную стратегию
	// в зависимости от размера множеств (клонируется меньшее множество).
	Optimization UnionStrategy = iota

	// CurrentSet при объединении клонирует исходное множество (CurrentSet)
	// и добавляет в него элементы входящего множества (IncomingSet).
	// Полезно, когда нужно сохранить приоритет элементов из текущего множества.
	CurrentSet

	// IncomingSet при объединении клонирует входящее множество (IncomingSet)
	// и добавляет в него элементы исходного множества (CurrentSet).
	// Полезно, когда входящее множество заведомо меньше или нужно сохранить его структуру.
	IncomingSet
)

Optimization определяет стратегию поведения при объединении множеств. Используется в функции UnionByStrategy.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL