【问题标题】:Is an embedded error exported?是否导出嵌入式错误?
【发布时间】:2016-02-28 01:35:44
【问题描述】:

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

【问题讨论】:

    标签: go embedding


    【解决方案1】:

    当您将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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 2017-08-18
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 2023-01-22
      相关资源
      最近更新 更多