先看这段代码

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})
}