先看这段代码
import (
"io"
"net/http"
"sync/atomic"
)
func main() {
var v atomic.Value
var err error
err = &http.ProtocolError{}
v.Store(err)
err = io.EOF
v.Store(err)
}
运行后会报错 panic: sync/atomic: store of inconsistently typed value into Value
。
原因是atomic.Value.Store
需要类型是一致的。在这里err
类型发生了变化,虽然他们都是error
接口类型。具体参考Issues#22550
怎么解决?包装一层就能运行了。
type tValue[T any] struct {
value T
}
func main() {
var v atomic.Value
var err error
err = &http.ProtocolError{}
v.Store(tValue[error]{err})
err = io.EOF
v.Store(tValue[error]{err})
}