根据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())
}
答案 0 :(得分:4)
当您将error
接口嵌入到结构中时,基本上,您可以向其中添加名为error
且类型为error
的字段。
因为它嵌入了你的结构现在也实现了它的所有方法。这意味着您的结构符合error
界面,您可以在其上调用Error()
或者只是将其原样传递给Println
,它会将其声明为error
并调用Error()
为您error
显然,因为字段名为error
,所以不会导出。但结构仍然满足Error()
接口,因为它具有Println
方法。
这样做的有趣结果是,如果您未初始化字段Error()
将会发生恐慌,因为它会尝试在https://play.golang.org/p/0VxUUX2l-z上调用<a>