为什么在 Go 中错误是零的?



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的,因此是可空的。

相关内容

  • 没有找到相关文章

最新更新