Go语言 是否导出嵌入错误?

avkwfej4  于 2023-05-11  发布在  Go
关注(0)|答案(2)|浏览(102)

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

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-K

bvuwiixz

bvuwiixz2#

e := foo.Err{}
e.error = errors.New("Hello world!") // error

这将导致错误,因为e.error无法从外部包访问。如果你需要设置这个字段,你可以声明一个构造函数:

func NewError(err error) *Error {
    return &Error{error: err}
}

但是如果你真的需要导出这个字段,这仍然是可能的:你可以声明一个类型别名:

type Error struct {
    Err
}
type Err = error

然后您可以从外部包访问e.Err字段。

相关问题