【问题标题】:Why are errors nillable in Go? [closed]为什么 Go 中的错误可以为零? [关闭]
【发布时间】: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


【解决方案1】:

我认为您可能混淆了一些概念。是的,“错误就是值”,因为它们不是可以抛出的异常,而是它们只是像任何其他返回值一样从函数返回的常规值。 Go 质量“错误就是值”与值与引用语义无关。

内置类型error是一个interface,所有接口值都是nilable,所以error是nilable。

【讨论】:

  • 谢谢。这就说得通了。我现在正在删除我的问题以避免投票风暴。
  • 我会尝试关闭它而不是删除它,因为我认为答案很有价值。让我们看看风暴是否会继续:-)
  • @JoshuaFox(帮助它关闭)。您的问题只是 SO 的题外话(因为它不是关于特定问题,而是引发了涉及语言设计哲学的广泛讨论)。我的意思是,在邮件列表或r/programmingr/golang 上会很好。
  • 谢谢。显然,在将我归零之前,投票风暴已经停止了 :-) 谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2021-09-22
相关资源
最近更新 更多