代码拉取完成,页面将自动刷新
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
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。