Documentation
¶
Index ¶
- func Copy[T comparable, I any](dst *Linker[T, I], src *Linker[T, I])
- type Linker
- func (linker *Linker[T, I]) Add(key T, value I)
- func (linker *Linker[T, I]) All() iter.Seq2[T, I]
- func (linker *Linker[T, I]) Clone() *Linker[T, I]
- func (linker *Linker[T, I]) Difference(l *Linker[T, I]) *Linker[T, I]
- func (linker *Linker[T, I]) Get(key T) (I, error)
- func (linker *Linker[T, I]) GetOrDefault(key T, d I) I
- func (linker *Linker[T, I]) Has(key T) bool
- func (linker *Linker[T, I]) HasAnd(items ...T) bool
- func (linker *Linker[T, I]) HasOr(items ...T) bool
- func (linker *Linker[T, I]) Intersection(l *Linker[T, I]) *Linker[T, I]
- func (linker *Linker[T, I]) Keys() []T
- func (linker *Linker[T, I]) Len() int
- func (linker *Linker[T, I]) Remove(key T)
- func (linker *Linker[T, I]) Replace(l *Linker[T, I])
- func (linker *Linker[T, I]) Reset()
- func (linker *Linker[T, I]) SymmetricDifference(l *Linker[T, I]) *Linker[T, I]
- func (linker *Linker[T, I]) Union(l *Linker[T, I]) *Linker[T, I]
- func (linker *Linker[T, I]) UnionByStrategy(l *Linker[T, I], strategy Strategy) *Linker[T, I]
- type Normalizer
- type Option
- type Strategy
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Copy ¶ added in v0.0.18
func Copy[T comparable, I any](dst *Linker[T, I], src *Linker[T, I])
Copy копирует все элементы из src в dst. Если ключ уже существует в dst, он будет перезаписан.
Пример:
dst := NewLinker[string, int]()
src := NewLinker[string, int](Link("one", 1))
Copy(dst, src) // dst содержит {"one": 1}
Types ¶
type Linker ¶
type Linker[T comparable, I any] struct { // contains filtered or unexported fields }
Linker представляет собой обобщённое отображение (map) ключей типа T на значения типа I. Поддерживает:
- Нормализацию ключей (например, приведение к нижнему регистру)
- Функциональные опции для конфигурации
- Операции над множествами (Union, Intersection, Difference, SymmetricDifference)
- Итерацию через All()
- Клонирование и копирование
Тип T должен быть сравниваемым (comparable), тип I может быть любым.
func NewLinker ¶
func NewLinker[T comparable, I any](options ...Option[T, I]) *Linker[T, I]
NewLinker создаёт новый Linker с опциональными настройками. Применяются следующие опции по умолчанию:
- Стандартный нормализатор (ключ без изменений)
- Опции переданные в вызове
Пример:
type Key string
linker := NewLinker[Key, int](
WithNormalizer[Key, int](func(k Key) Key { return Key(strings.ToLower(string(k))) }),
Link(Key("one"), 1),
Link(Key("two"), 2),
)
func (*Linker[T, I]) Add ¶
func (linker *Linker[T, I]) Add(key T, value I)
Add добавляет пару (ключ, значение) в Linker. Ключ перед добавлением нормализуется с помощью normalizer. Если ключ уже существует, значение будет перезаписано.
Пример:
linker := NewLinker[string, int](KeyStringNormalizer[int]())
linker.Add("KEY", 42)
linker.Add("key", 100) // перезапишет значение для "key"
func (*Linker[T, I]) All ¶
All возвращает итератор для обхода всех элементов Linker. Реализует интерфейс iter.Seq2, позволяя использовать range в цикле. Возвращает пары (ключ, значение) в нормализованном виде.
Пример:
for key, value := range linker.All() {
fmt.Printf("%v: %v\n", key, value)
}
Итерацию можно прервать досрочно:
for key, value := range linker.All() {
if someCondition(value) {
break
}
}
func (*Linker[T, I]) Clone ¶ added in v0.0.17
Clone создаёт глубокую копию Linker. Нормализатор также копируется.
Пример:
original := NewLinker[string, int](Link("one", 1))
copy := original.Clone()
copy.Add("two", 2) // original не изменится
func (*Linker[T, I]) Difference ¶ added in v0.0.17
Difference возвращает новый Linker, содержащий элементы текущего линкера, ключи которых отсутствуют в переданном линкере.
Пример:
a := NewLinker[string, int](Link("one", 1), Link("two", 2))
b := NewLinker[string, int](Link("two", 20), Link("three", 3))
c := a.Difference(b) // содержит {"one": 1}
func (*Linker[T, I]) Get ¶
Get возвращает значение по ключу. Ключ нормализуется перед поиском.
Возвращает:
- I — найденное значение
- error — ошибку DoesNotExistError, если ключ не найден
Пример:
linker := NewLinker[string, int](Link("one", 1))
val, err := linker.Get("ONE")
if errors.Is(err, errors.DoesNotExistError) {
// ключ не найден
}
func (*Linker[T, I]) GetOrDefault ¶
func (linker *Linker[T, I]) GetOrDefault(key T, d I) I
GetOrDefault возвращает значение по ключу или значение по умолчанию d, если ключ не найден. Ключ нормализуется перед поиском.
Пример:
linker := NewLinker[string, int](Link("one", 1))
val := linker.GetOrDefault("TWO", 0) // возвращает 0
func (*Linker[T, I]) Has ¶
Has проверяет наличие ключа в Linker. Ключ нормализуется перед проверкой.
Пример:
linker := NewLinker[string, int](Link("one", 1))
if linker.Has("ONE") {
// ключ существует
}
func (*Linker[T, I]) HasAnd ¶ added in v1.0.0
HasAnd проверяет, содержатся ли ВСЕ переданные ключи в Linker. Возвращает true, только если каждый ключ присутствует.
Пример:
linker := NewLinker[string, int](Link("one", 1), Link("two", 2))
linker.HasAnd("one", "two") // true
linker.HasAnd("one", "three") // false
func (*Linker[T, I]) HasOr ¶ added in v1.0.0
HasOr проверяет, содержится ли ХОТЯ БЫ ОДИН из переданных ключей в Linker. Возвращает true при первом же найденном ключе.
Пример:
linker := NewLinker[string, int](Link("one", 1), Link("two", 2))
linker.HasOr("three", "one") // true
linker.HasOr("three", "four") // false
func (*Linker[T, I]) Intersection ¶ added in v0.0.17
Intersection возвращает новый Linker, содержащий только те пары (ключ, значение), ключи которых присутствуют в обоих линкерах. Значения берутся из линкера, который используется для итерации (того, который меньше по размеру).
Пример:
a := NewLinker[string, int](Link("one", 1), Link("two", 2))
b := NewLinker[string, int](Link("two", 20), Link("three", 3))
c := a.Intersection(b) // содержит {"two": 2} или {"two": 20} (зависит от размера)
func (*Linker[T, I]) Keys ¶ added in v0.0.8
func (linker *Linker[T, I]) Keys() []T
Keys возвращает срез всех ключей, хранящихся в Linker. Порядок ключей не гарантируется.
Пример:
for _, key := range linker.Keys() {
fmt.Println(key)
}
func (*Linker[T, I]) Len ¶ added in v0.0.7
Len возвращает количество элементов в Linker.
Пример:
linker := NewLinker[string, int](Link("one", 1), Link("two", 2))
fmt.Println(linker.Len()) // 2
func (*Linker[T, I]) Remove ¶
func (linker *Linker[T, I]) Remove(key T)
Remove удаляет ключ и связанное с ним значение из Linker. Ключ нормализуется перед удалением. Если ключ не найден, метод ничего не делает.
Пример:
linker := NewLinker[string, int](Link("one", 1))
linker.Remove("ONE") // удаляет запись
func (*Linker[T, I]) Replace ¶ added in v0.0.19
Replace заменяет содержимое текущего линкера на содержимое переданного. Текущий линкер очищается, после чего в него копируются все элементы из l. Нормализатор текущего линкера не изменяется.
Пример:
a := NewLinker[string, int](Link("one", 1))
b := NewLinker[string, int](Link("two", 2))
a.Replace(b) // a теперь содержит {"two": 2}
func (*Linker[T, I]) Reset ¶ added in v0.0.11
func (linker *Linker[T, I]) Reset()
Reset очищает Linker, удаляя все элементы.
Пример:
linker.Reset() fmt.Println(linker.Len()) // 0
func (*Linker[T, I]) SymmetricDifference ¶ added in v1.0.0
SymmetricDifference возвращает новый Linker, содержащий элементы, которые присутствуют либо в текущем линкере, либо в переданном, но не в обоих одновременно.
Пример:
a := NewLinker[string, int](Link("one", 1), Link("two", 2))
b := NewLinker[string, int](Link("two", 20), Link("three", 3))
c := a.SymmetricDifference(b) // содержит {"one": 1, "three": 3}
func (*Linker[T, I]) Union ¶ added in v0.0.18
Union возвращает объединение текущего линкера и переданного. Использует стратегию Optimization (см. UnionByStrategy).
Пример:
a := NewLinker[string, int](Link("one", 1))
b := NewLinker[string, int](Link("two", 2))
c := a.Union(b) // содержит {"one": 1, "two": 2}
При конфликте ключей значение берётся из линкера, который был клонирован (зависит от стратегии).
func (*Linker[T, I]) UnionByStrategy ¶ added in v0.0.18
UnionByStrategy возвращает объединение линкеров с использованием указанной стратегии. Доступные стратегии:
- Optimization (умный выбор — клонируется больший линкер)
- CurrentLinker (клонируется текущий линкер, добавляются элементы из l)
- IncomingLinker (клонируется линкер l, добавляются элементы из текущего)
При конфликте ключей значение берётся из клонируемого линкера.
Пример:
a := NewLinker[string, int](Link("one", 1))
b := NewLinker[string, int](Link("one", 100))
c := a.UnionByStrategy(b, CurrentLinker) // c["one"] == 1
d := a.UnionByStrategy(b, IncomingLinker) // d["one"] == 100
type Normalizer ¶ added in v0.0.14
type Normalizer[T comparable] func(key T) T
Normalizer определяет функцию нормализации ключей. Принимает ключ и возвращает его нормализованную версию. По умолчанию используется функция, возвращающая ключ без изменений.
type Option ¶ added in v0.0.14
type Option[T comparable, I any] func(l *Linker[T, I])
Option представляет функцию настройки (functional option) для Linker. Используется для конфигурирования поведения Linker при создании.
func KeyStringNormalizer ¶ added in v0.0.14
KeyStringNormalizer возвращает опцию для регистронезависимой нормализации строковых ключей. Применяется только для Linker с типом ключа string. Все ключи будут приведены к нижнему регистру.
Пример:
linker := NewLinker[string, int](
KeyStringNormalizer[int](),
)
linker.Add("KEY", 42)
linker.Has("key") // true
func Link ¶
func Link[T comparable, I any](key T, val I) Option[T, I]
Link создаёт опцию для добавления пары (ключ, значение) в Linker. Полезно для начальной инициализации Linker при вызове NewLinker.
Пример:
linker := NewLinker[string, int](
Link("one", 1),
Link("two", 2),
)
func WithNormalizer ¶ added in v0.0.14
func WithNormalizer[T comparable, I any](normalizer Normalizer[T]) Option[T, I]
WithNormalizer устанавливает пользовательскую функцию нормализации ключей. Нормализатор применяется ко всем операциям с ключами (Add, Get, Has, Remove).
Пример:
linker := NewLinker[string, int](
WithNormalizer(strings.ToUpper),
)
type Strategy ¶ added in v0.0.18
type Strategy uint8
Strategy представляет стратегию слияния двух Linker'ов.
const ( // Optimization (значение по умолчанию) выбирает наиболее эффективную стратегию // в зависимости от размера линкеров (клонируется меньший). Optimization Strategy = iota // CurrentLinker при объединении клонирует текущий Linker (CurrentLinker) // и добавляет в него элементы входящего линкера (IncomingLinker). CurrentLinker // IncomingLinker при объединении клонирует входящий Linker (IncomingLinker) // и добавляет в него элементы текущего линкера (CurrentLinker). IncomingLinker )
Strategy определяет стратегию поведения при объединении (Union) двух Linker'ов. Используется в функции UnionByStrategy.