github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/isc/setobj.go (about) 1 package isc 2 3 import ( 4 "fmt" 5 ) 6 7 type ISCSet[T comparable] map[T]struct{} 8 9 // NewSet 初始化并指定存储对象的类型 10 func NewSet[T comparable]() ISCSet[T] { 11 return ISCSet[T]{} 12 } 13 14 func NewSetWithList[T comparable](list []T) ISCSet[T] { 15 s := ISCSet[T]{} 16 s.AddAll(list...) 17 return s 18 } 19 20 func NewSetWithItems[T comparable](items ...T) ISCSet[T] { 21 s := ISCSet[T]{} 22 s.AddAll(items...) 23 return s 24 } 25 26 // Size 返回数据数量 27 func (s ISCSet[T]) Size() int { 28 return len(s) 29 } 30 31 // Add 添加元素 32 func (s *ISCSet[T]) Add(item T) error { 33 if !s.Contains(item) { 34 (*s)[item] = struct{}{} 35 return nil 36 } else { 37 return fmt.Errorf("%v already exists in set", item) 38 } 39 } 40 41 // AddAll 添加多个元素 42 func (s *ISCSet[T]) AddAll(items ...T) { 43 for _, item := range items { 44 _ = s.Add(item) 45 } 46 } 47 48 // Delete 删除指定Key元素 49 func (s *ISCSet[T]) Delete(item T) error { 50 if s.Contains(item) { 51 delete(*s, item) 52 return nil 53 } else { 54 return fmt.Errorf("%v not exists in set", item) 55 } 56 } 57 58 // Contains 判断key是否存在 59 func (s ISCSet[T]) Contains(item T) bool { 60 _, ok := s[item] 61 return ok 62 } 63 64 // Clear 重置 65 func (s *ISCSet[T]) Clear() { 66 *s = ISCSet[T]{} 67 } 68 69 func (s ISCSet[T]) ToList() ISCList[T] { 70 res := NewList[T]() 71 for k := range s { 72 res.Add(k) 73 } 74 return res 75 }