go: 泛型封装系统库 在go 1.18之后引入了泛型,终于可以让系统库更加好用 ## sync.Map ``` 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: ``` m := pkg.NewSyncMap[string, int]() m.Store("hello", 123) ``` 或者使用xsync包 ``` // import "github.com/puzpuzpuz/xsync" m := xsync.NewMapOf[int]() m.Store("hello", 123) ``` ## atomic.Value ``` 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) } ``` 使用: ``` v := pkg.NewAtomicValue(123) v.Load() ``` 来自 大脸猪 写于 2022-03-15 22:22 -- 更新于2022-03-15 22:32 -- 0 条评论