В Go нет встроенного множества, как set в Python. Сделай его.
type Set[T comparable] struct {
// на твоё усмотрение
}
func NewSet[T comparable](items ...T) *Set[T]
func (s *Set[T]) Add(items ...T)
func (s *Set[T]) Remove(item T)
func (s *Set[T]) Has(item T) bool
func (s *Set[T]) Len() int
func (s *Set[T]) Items() []T // в любом порядке
func (s *Set[T]) Union(other *Set[T]) *Set[T]
func (s *Set[T]) Intersect(other *Set[T]) *Set[T]
Требования
- Повторное добавление элемента ничего не меняет, удаление отсутствующего — тоже.
Union и Intersect возвращают новое множество и не меняют операнды.
Items возвращает копию: её изменение не влияет на множество.
- Работает с любым
comparable-типом: строки, числа, структуры.
Пример
a := NewSet(1, 2, 3)
b := NewSet(2, 3, 4)
a.Union(b).Len() // 4
a.Intersect(b).Has(1) // false
a.Len() // 3 — операнды не изменились
- Нулевое значение готово к работе, как у
sync.Mutex и bytes.Buffer:
var s Set[string]; s.Add("x") не паникует. Has, Len, Remove, Items
на нулевом множестве тоже работают. nil в роли other в Union и
Intersect считается пустым множеством.
- Разность:
func (s *Set[T]) Difference(other *Set[T]) *Set[T] // элементы s, которых нет в other
Устно: почему значение map — struct{}, а не bool? Как сделать set
потокобезопасным?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.