2016-02-28 50 views
0

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

回答

2

當你嵌入error接口轉換成一個結構,基本上你添加一個名爲errorerror類型吧。

因爲嵌入了你的結構,所以現在也實現了它的所有方法。這意味着你的結構滿足error接口,並且可以調用Error()上,或只是把它傳遞給Println,因爲它是,它會鍵入它斷言爲error,並呼籲Error()https://play.golang.org/p/0VxUUX2l-z

很明顯,因爲場被命名爲error它未導出。但是該結構仍然滿足error接口,因爲它有Error()方法。

的這個有趣的結果是,如果你不初始化場Println會驚慌,因爲它會嘗試調用Error()在零https://play.golang.org/p/XctFgKZI-K