猿问

为什么 Go 中的错误可以为零?

Go 中的错误可以为零。以下编译:


   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给一个值变量。


这是如何运作的?


慕姐8265434
浏览 91回答 1
1回答

子衿沉夜

我想你可能混淆了一些概念。是的,“错误是值”,因为它们不是可以抛出的异常,而是它们只是从函数返回的常规值,就像任何其他返回值一样。Go 质量“错误就是值”与值与引用语义无关。内置类型error是 an interface,所有接口值都是可空的,所以error也是可空的。
随时随地看视频慕课网APP

相关分类

Go
我要回答