(转)golang并发atomic.Value安全操作

2019-04-17  本文已影响0人  one_zheng
// 通过封装atomic.Value原子值类型,可以实现安全存储不会引发panic

type atomicValue struct {
    v atomic.Value
    t reflect.Type
}

func NewAtomicValue(example interface{}) (*atomicValue, error) {
    if example == nil {
        return nil, errors.New("atomic value: nil example")
    }
    return &atomicValue{
        t: reflect.TypeOf(example),
    }, nil
}

func (av *atomicValue) Store(v interface{}) error {
    if v == nil {
        return errors.New("atomic value: nil value")
    }
    t := reflect.TypeOf(v)
    if t != av.t {
        return fmt.Errorf("atomic value: wrong type: %s", t)
    }
    av.v.Store(v)
    return nil
}

func (av *atomicValue) Load() interface{} {
    return av.v.Load()
}

func (av *atomicValue) TypeOfValue() reflect.Type {
    return av.t
}

上一篇下一篇

猜你喜欢

热点阅读