Documentation
¶
Overview ¶
Package set предоставляет реализацию типобезопасного множества (Set) на основе хэш-таблицы. Множество поддерживает операции объединения, пересечения, разности и симметрической разности.
Index ¶
- type Set
- func (s *Set[T]) Add(items ...T)
- func (s *Set[T]) Clone() Set[T]
- func (s *Set[T]) Contains(item T) bool
- func (s *Set[T]) ContainsAnd(items ...T) bool
- func (s *Set[T]) ContainsOr(items ...T) bool
- func (s *Set[T]) Difference(set Set[T]) Set[T]
- func (s *Set[T]) Equal(set Set[T]) bool
- func (s *Set[T]) Filter(predicate func(T) bool) Set[T]
- func (s *Set[T]) Intersection(set Set[T]) Set[T]
- func (s *Set[T]) Len() int
- func (s *Set[T]) MarshalJSON() ([]byte, error)
- func (s *Set[T]) Merge(set Set[T])
- func (s *Set[T]) Remove(item T)
- func (s *Set[T]) Replace(set Set[T])
- func (s *Set[T]) Reset()
- func (s *Set[T]) Scan(value any) error
- func (s *Set[T]) SymmetricDifference(set Set[T]) Set[T]
- func (s *Set[T]) ToSlice() []T
- func (s *Set[T]) Union(set Set[T]) Set[T]
- func (s *Set[T]) UnionByStrategy(set Set[T], strategy UnionStrategy) Set[T]
- func (s *Set[T]) UnmarshalJSON(data []byte) error
- func (s *Set[T]) Value() (driver.Value, error)
- type UnionStrategy
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 ¶
Clone возвращает глубокую копию множества. Для nil-множества возвращает пустое выделенное множество (не nil).
Пример:
original := NewSet(1, 2, 3)
copy := original.Clone() // copy содержит {1, 2, 3}, но является отдельным множеством
func (*Set[T]) Contains ¶
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
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
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
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
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
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
Intersection возвращает новое множество, содержащее элементы, присутствующие одновременно в текущем множестве и в множестве set. Операция выполняется итерацией по меньшему множеству для оптимальной производительности.
Пример:
a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
c := a.Intersection(b) // c содержит {2, 3
func (*Set[T]) Len ¶
Len возвращает количество элементов в множестве. Для nil-множества возвращает 0.
Пример:
s := NewSet(1, 2, 3) s.Len() // 3
func (*Set[T]) MarshalJSON ¶
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
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
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 ¶
Scan реализует интерфейс sql.Scanner для чтения множества из базы данных. Поддерживает чтение JSON-массивов из колонок типов []byte или string.
func (*Set[T]) SymmetricDifference ¶ added in v1.0.0
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
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 ¶
UnmarshalJSON реализует интерфейс json.Unmarshaler. Десериализует JSON-массив в множество. Поддерживает null и пустые массивы.
Пример:
var s Set[int]
json.Unmarshal([]byte("[1,2,3]"), &s) // s содержит {1, 2, 3}
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.