safe_array.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package util
  2. import "sync"
  3. type SafeArray[T any] struct {
  4. mu sync.Mutex
  5. list []T
  6. }
  7. // Push 一个元素
  8. func (sa *SafeArray[T]) Push(v T) {
  9. sa.mu.Lock()
  10. defer sa.mu.Unlock()
  11. sa.list = append(sa.list, v)
  12. }
  13. // PushMany 多个元素
  14. func (sa *SafeArray[T]) PushMany(vs []T) {
  15. sa.mu.Lock()
  16. defer sa.mu.Unlock()
  17. sa.list = append(sa.list, vs...)
  18. }
  19. // Pop 最后一个元素
  20. func (sa *SafeArray[T]) Pop() (zero T, ok bool) {
  21. sa.mu.Lock()
  22. defer sa.mu.Unlock()
  23. if len(sa.list) == 0 {
  24. return zero, false
  25. }
  26. last := sa.list[len(sa.list)-1]
  27. sa.list = sa.list[:len(sa.list)-1]
  28. return last, true
  29. }
  30. // Flush 清空并返回所有元素
  31. func (sa *SafeArray[T]) Flush() []T {
  32. sa.mu.Lock()
  33. defer sa.mu.Unlock()
  34. res := sa.list
  35. sa.list = make([]T, 0)
  36. return res
  37. }
  38. func (sa *SafeArray[T]) View() []T {
  39. sa.mu.Lock()
  40. defer sa.mu.Unlock()
  41. listCopy := make([]T, len(sa.list))
  42. copy(listCopy, sa.list)
  43. return listCopy
  44. }
  45. func (sa *SafeArray[T]) Iterate(fn func(T)) {
  46. sa.mu.Lock()
  47. defer sa.mu.Unlock()
  48. for _, item := range sa.list {
  49. fn(item)
  50. }
  51. }
  52. func (sa *SafeArray[T]) ForEach(fn func(T)) {
  53. sa.mu.Lock()
  54. listCopy := make([]T, len(sa.list))
  55. copy(listCopy, sa.list)
  56. sa.mu.Unlock()
  57. for _, item := range listCopy {
  58. fn(item)
  59. }
  60. }