1 Star 1 Fork 0

李爽 / go-utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
slice.go 1.67 KB
一键复制 编辑 原始数据 按行查看 历史
package obj
import (
"fmt"
"reflect"
"sync"
)
// Slice 是支持任何类型的切片的泛型类型。
type Slice[T any] struct {
Value []T
mux sync.RWMutex
}
// NewSlice 创建通用 Slice 的新实例。
func NewSlice[T any](size int) *Slice[T] {
return &Slice[T]{
Value: make([]T, size),
}
}
// Set 添加或更新切片的值。
func (s *Slice[T]) Set(value []T) {
s.mux.Lock()
defer s.mux.Unlock()
s.Value = value
}
// Get 从切片中检索值。
func (s *Slice[T]) Get() []T {
s.mux.RLock()
defer s.mux.RUnlock()
return s.Value
}
// Display 显示切片中的所有值。
func (s *Slice[T]) Display() {
s.mux.RLock()
defer s.mux.RUnlock()
for _, v := range s.Value {
fmt.Printf("value: %v\n", v)
}
}
// Clean 清空切片。
func (s *Slice[T]) Clean() {
s.mux.Lock()
defer s.mux.Unlock()
s.Value = nil
}
// Size 返回切片的大小。
func (s *Slice[T]) Size() int {
s.mux.RLock()
defer s.mux.RUnlock()
return len(s.Value)
}
// Clone 克隆切片。
func (s *Slice[T]) Clone() *Slice[T] {
s.mux.RLock()
defer s.mux.RUnlock()
newSlice := NewSlice[T](len(s.Value))
copy(newSlice.Value, s.Value)
return newSlice
}
// Add 添加一个新值到切片。
// 只有在切片中不存在该值时才添加。
func (s *Slice[T]) Add(item T) {
s.mux.Lock()
defer s.mux.Unlock()
// 检查元素是否存在
for _, v := range s.Value {
if reflect.DeepEqual(v, item) {
return
}
}
s.Value = append(s.Value, item)
}
// Remove 从切片中删除一个值。
func (s *Slice[T]) Remove(item T) {
s.mux.Lock()
defer s.mux.Unlock()
for i, v := range s.Value {
if reflect.DeepEqual(v, item) {
s.Value = append(s.Value[:i], s.Value[i+1:]...)
return
}
}
}
Go
1
https://gitee.com/love_bass/go-utils.git
git@gitee.com:love_bass/go-utils.git
love_bass
go-utils
go-utils
v0.6.6

搜索帮助