Go 中的错误可以为 nil。以下编译:
var err error
err = nil
err = errors.New("hello")
然而,错误是值,值类型在 Go 中不可为空。
看error
,这是一个普通的接口:
type error interface {
Error() string
}
由此结构实现:
type errorString struct {
s string
}
这里没有指针。有一种方法需要指针接收器,
func (e *errorString) Error() string {
return e.s
}
然而,这并不能解释为什么error
表现为指针而不是值。
errors.New()
确实返回了一个指针,
func New(text string) error {
return &errorString{text}
}
这使得我上面的第三行代码更加令人费解——我们将New
的结果分配给一个值变量。
这是如何工作的?
我想你可能把一些概念混为一谈了。是的,"错误是值",因为它们不是可以抛出的异常,而是像任何其他返回值一样从函数返回的常规值。Go 质量"错误是值"与值与引用语义无关。
内置类型error
是一个interface
,所有接口值都是可error
的,因此是可空的。