是否导出嵌入错误?
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()
根据 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()