是否导出嵌入式错误?

时间:2016-02-28 01:35:45

标签: go embedding

根据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())
}

1 个答案:

答案 0 :(得分:4)

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

因为它嵌入了你的结构现在也实现了它的所有方法。这意味着您的结构符合error界面,您可以在其上调用Error()或者只是将其原样传递给Println,它会将其声明为error并调用Error()为您error

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

这样做的有趣结果是,如果您未初始化字段Error()将会发生恐慌,因为它会尝试在https://play.golang.org/p/0VxUUX2l-z上调用<a>