Go 为什么围棋中的错误是零?

Go 为什么围棋中的错误是零?,go,error-handling,interface,null,Go,Error Handling,Interface,Null,Go中的错误可以为零。汇编如下: var err error err = nil err = errors.New("hello") 然而,和值类型在Go中不能为null 从错误来看,这是一个普通的接口: type error interface { Error() string } 由此结构实现: type errorString struct { s string } 这里没有指针。有一种方法采用指针接收器 func (e *errorString)

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

   var err error
   err = nil 
   err = errors.New("hello")
然而,和值类型在Go中不能为null

从错误来看,这是一个普通的接口:

type error interface {
    Error() string
}
由此结构实现:

type errorString struct {
    s string
}
这里没有指针。有一种方法采用指针接收器

func (e *errorString) Error() string {
    return e.s
}
但这并不能解释为什么错误表现为指针而不是值

错误。New确实返回指针

func New(text string) error {
    return &errorString{text}
}
这使得我上面的第三行代码更加令人费解——我们将New的结果赋给一个值变量


这是怎么回事

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


内置类型错误是一个接口,所有接口值都是可为零的,因此错误是可为零的。

错误只是一个接口,而nil是一个有效的接口值。Go没有值类型的概念,因此您的语句值类型在Go中是不可为零的。Go是完全错误的。谢谢。这是有道理的。我现在删除我的问题,以避免一场投票风暴。我将尝试关闭它,而不是删除,因为我认为答案是有价值的。让我们看看风暴是否会继续:-@JoshuaFox帮助它关闭。你的问题只是离题,因为它不是关于某个特定的问题,而是引发了一场涉及语言设计哲学的广泛讨论。我的意思是,在邮件列表或r/编程或r/golang上都可以。谢谢。显然,在把我归零之前,投票风暴已经停止了:-谢谢你的回答。