是否导出嵌入错误?

Is an embedded error exported?

根据 Go language spec,我可以在结构中嵌入类型。

error 接口有一个奇怪的情况。它不是大写的,所以我假设它没有作为类型导出。但它是由语言定义的。所以如果我有这样的结构:

package foo

type Err struct {
    error
}

嵌入的error是导出的吗? Err是否满足error接口?

我可以从另一个包访问它吗,即以下是否可以?

package main

import "errors"
import "fmt"
import "foo"

func main() {
    e := foo.Err{}
    e.error = errors.New("Hello world!") // is this okay?
    fmt.Println(e.Error())
}

当您将 error 接口嵌入到结构中时,基本上,您会向其添加一个名为 error 且类型为 error 的字段。

因为它是嵌入的,所以您的结构现在也实现了它的所有方法。这意味着您的结构满足 error 接口,您可以在其上调用 Error() 或直接将其传递给 Println,它会将断言输入 error 并调用Error() 给你 https://play.golang.org/p/0VxUUX2l-z

显然,因为字段名为 error,所以不会导出。但是该结构仍然满足 error 接口,因为它具有 Error() 方法。

有趣的结果是,如果您不初始化该字段,Println 将出现恐慌,因为它将尝试在 nil https://play.golang.org/p/XctFgKZI-K

上调用 Error()