49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
|
|
package cache
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"sync"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// SliceCache结构体代表基于切片的缓存,内部使用切片存储元素,并通过读写锁保证并发安全
|
|||
|
|
type SliceCache struct {
|
|||
|
|
data []interface{}
|
|||
|
|
rwmu sync.RWMutex
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewSliceCache创建并返回一个新的基于切片的缓存实例
|
|||
|
|
func NewSliceCache() *SliceCache {
|
|||
|
|
return &SliceCache{
|
|||
|
|
data: make([]interface{}, 0),
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Add方法用于向切片缓存中添加元素,写操作加写锁保证并发安全
|
|||
|
|
func (sc *SliceCache) Add(element interface{}) {
|
|||
|
|
sc.rwmu.Lock()
|
|||
|
|
sc.data = append(sc.data, element)
|
|||
|
|
sc.rwmu.Unlock()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetAll方法用于获取切片缓存中的所有元素,读操作加读锁允许并发读
|
|||
|
|
func (sc *SliceCache) GetAll() []interface{} {
|
|||
|
|
sc.rwmu.RLock()
|
|||
|
|
result := make([]interface{}, len(sc.data))
|
|||
|
|
copy(result, sc.data)
|
|||
|
|
sc.rwmu.RUnlock()
|
|||
|
|
return result
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Remove方法用于从切片缓存中删除指定元素,写操作加写锁保证并发安全
|
|||
|
|
func (sc *SliceCache) Remove(element interface{}) bool {
|
|||
|
|
sc.rwmu.Lock()
|
|||
|
|
for i, e := range sc.data {
|
|||
|
|
if e == element {
|
|||
|
|
sc.data = append(sc.data[:i], sc.data[i+1:]...)
|
|||
|
|
sc.rwmu.Unlock()
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
sc.rwmu.Unlock()
|
|||
|
|
return false
|
|||
|
|
}
|