package atomicvalue
import "sync/atomic"
type AtomicValue[T any] struct {
v atomic.Value
}
func (av *AtomicValue[T]) Load() T {
if v := av.v.Load(); v != nil {
return v.(T)
} else {
var v T
return v
}
}
func (av *AtomicValue[T]) Store(value T) {
av.v.Store(value)
}
func (av *AtomicValue[T]) CompareAndSwap(old, new T) bool {
return av.v.CompareAndSwap(old, new)
}
func (av *AtomicValue[T]) Swap(new T) (old T) {
old = av.Load()
av.Store(new)
return old
}
Я переносю атомное значение.Value в общий тип. Я обработал нулевое значение в функции Load(), но не могу сохранить ноль.
type MyInterface interface{
One()
Two()
Three()
}
var value atomicvalue.AtomicValue[MyInterface]
bar:=&MyStruct{} // MyStruct implements MyInterface
value.store(bar) // ok
value.store(nil) // panic there
Когда я сохраняю ноль, будет паника:
panic: sync/atomic: store of nil value into Value
Согласно документам:
Значение обеспечивает атомарную загрузку и сохранение последовательно типизированного значения.
Итак, это работает:
v := atomic.Value{}
var x *int
v.Store(x)
Но это не так, как и любое другое значение nil интерфейса, потому что фактический тип значения не согласован:
v := atomic.Value{}
var x any
v.Store(x)
Вы можете сделать это с помощью указателя на значение.
Load() возвращает значение, установленное самым последним хранилищем. Он возвращает ноль, если для этого значения не было вызова Store. так нет ли способа сбросить/удалить/очистить атомное значение, чтобы Load() мог снова вернуть ноль после сохранения значения?