在go 1.18之后引入了泛型,终于可以让系统库更加好用
sync.Map
代码语言:javascript复制package pkg
import "sync"
func NewSyncMap[K, V any]() *SyncMap[K, V] {
s := new(SyncMap[K, V])
s.m = new(sync.Map)
return s
}
type SyncMap[K, V any] struct {
m *sync.Map
}
func (s *SyncMap[K, V]) Load(key K) (V, bool) {
v, ok := s.m.Load(key)
if ok {
return v.(V), ok
}
var empty V
return empty, false
}
func (s *SyncMap[K, V]) Store(key K, val V) {
s.m.Store(key, val)
}
func (s *SyncMap[K, V]) Range(f func(key K, val V) bool) {
s.m.Range(func(key, value any) bool {
return f(key.(K), value.(V))
})
}
func (s *SyncMap[K, V]) Delete(key K) {
s.m.Delete(key)
}
使用,类似sync.Map:
代码语言:javascript复制m := pkg.NewSyncMap[string, int]()
m.Store("hello", 123)
或者使用xsync包
代码语言:javascript复制// import "github.com/puzpuzpuz/xsync"
m := xsync.NewMapOf[int]()
m.Store("hello", 123)
atomic.Value
代码语言:javascript复制package pkg
import "sync/atomic"
func NewAtomicValue[V any](v V) *AtomicValue[V] {
a := new(AtomicValue[V])
a.Store(v)
return a
}
type AtomicValue[V any] struct {
a atomic.Value
}
func (a *AtomicValue[V]) Store(val V) {
a.a.Store(val)
}
func (a *AtomicValue[V]) Load() V {
return a.a.Load().(V)
}
使用:
代码语言:javascript复制v := pkg.NewAtomicValue(123)
v.Load()