【发布时间】:2020-08-27 00:20:58
【问题描述】:
Go 中的错误可以为零。以下编译:
var err error
err = nil
err = errors.New("hello")
然而errors are values,并且值类型在 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 的结果分配给一个值变量。
这是如何工作的?
【问题讨论】:
-
error只是一个接口,nil是一个有效的接口值。 -
Go 没有“值类型”的概念,因此您的声明“值类型在 Go 中不可为空”是空洞的错误。
标签: go error-handling interface null