根据Go语言规范,我可以在结构中嵌入类型。error
接口有一个奇怪的情况。它没有大写,所以我假设它没有作为类型导出。但它是由语言定义的。如果我有一个这样的struct:
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())
}
2条答案
按热度按时间k3bvogb11#
当您将
error
接口嵌入到结构体中时,基本上,您将向其添加一个名为error
的字段,其类型为error
。因为它是嵌入式的,所以你的结构现在也实现了它的所有方法。这意味着您的结构满足
error
接口,您可以在其上调用Error()
,或者直接将其传递给Println
,它将在error
中输入assert并为您调用Error()
https://play.golang.org/p/0VxUUX2l-z显然,由于字段名为
error
,因此不会导出它。但是结构体仍然满足error
接口,因为它有Error()
方法。有趣的结果是,如果不初始化字段
Println
,它将死机,因为它将尝试在nil上调用Error()
https://play.golang.org/p/XctFgKZI-Kbvuwiixz2#
这将导致错误,因为
e.error
无法从外部包访问。如果你需要设置这个字段,你可以声明一个构造函数:但是如果你真的需要导出这个字段,这仍然是可能的:你可以声明一个类型别名:
然后您可以从外部包访问
e.Err
字段。