Jos*_*Fox -3 error-handling null interface go
Go 中的错误可能为零。编译如下:
var err error
err = nil
err = errors.New("hello")
Run Code Online (Sandbox Code Playgroud)
然而错误是值,并且值类型在 Go 中不可为空。
看了一下error,是一个普通的界面:
type error interface {
Error() string
}
Run Code Online (Sandbox Code Playgroud)
由该结构体实现:
type errorString struct {
s string
}
Run Code Online (Sandbox Code Playgroud)
这里没有指点。有一种方法需要一个指针接收器,
func (e *errorString) Error() string {
return e.s
}
Run Code Online (Sandbox Code Playgroud)
但这并不能解释为什么它error表现为指针而不是值。
errors.New()确实返回一个指针,
func New(text string) error {
return &errorString{text}
}
Run Code Online (Sandbox Code Playgroud)
这使得我上面的第三行代码更加令人费解——我们将 的结果分配New给一个值变量。
这是如何运作的?
我认为您可能会混淆一些概念。是的,“错误就是值”,因为它们不是可以抛出的异常,而只是像任何其他返回值一样从函数返回的常规值。Go 质量“错误即值”与值与引用语义无关。
内置类型error是 an interface,所有接口值都是nilable,所以error是nilable。