Может лиatomic.Value хранить нулевой интерфейс{}?

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
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документам:

Значение обеспечивает атомарную загрузку и сохранение последовательно типизированного значения.

Итак, это работает:

    v := atomic.Value{}
    var x *int
    v.Store(x)

Но это не так, как и любое другое значение nil интерфейса, потому что фактический тип значения не согласован:

    v := atomic.Value{}
    var x any
    v.Store(x)

Load() возвращает значение, установленное самым последним хранилищем. Он возвращает ноль, если для этого значения не было вызова Store. так нет ли способа сбросить/удалить/очистить атомное значение, чтобы Load() мог снова вернуть ноль после сохранения значения?

kuokongqingyun 10.04.2024 17:41

Вы можете сделать это с помощью указателя на значение.

Burak Serdar 10.04.2024 17:54

Другие вопросы по теме