Go中有一個名爲error的內置接口,定義以下:函數
type error interface {測試
Go是使用一個獨立的·明確的返回值來傳遞錯誤信息的。這與使用異常的 Java 和 Ruby 以及在 C 語言中常常見到的超重的單返回值/錯誤值相比,Go 語言的處理方式能清楚的知道哪一個函數返回了錯誤,並能想調用那些沒有出錯的函數同樣調用。
package main
import "errors" import "fmt" // 按照慣例,錯誤一般是最後一個返回值而且是 `error` 類 // 型,一個內建的接口。 func f1(arg int) (int, error) { if arg == 42 { // `errors.New` 構造一個使用給定的錯誤信息的基本 // `error` 值。 return -1, errors.New("can't work with 42") } // 返回錯誤值爲 nil 表明沒有錯誤。 return arg + 3, nil } // 經過實現 `Error` 方法來自定義 `error` 類型是能夠得。 // 這裏使用自定義錯誤類型來表示上面的參數錯誤。 type argError struct { arg int prob string } func (e *argError) Error() string { return fmt.Sprintf("%d - %s", e.arg, e.prob) } func f2(arg int) (int, error) { if arg == 42 { // 在這個例子中,咱們使用 `&argError` 語法來創建一個 // 新的結構體,並提供了 `arg` 和 `prob` 這個兩個字段 // 的值。 return -1, &argError{arg, "can't work with it"} } return arg + 3, nil } func main() { // 下面的兩個循環測試了各個返回錯誤的函數。注意在 `if` // 行內的錯誤檢查代碼,在 Go 中是一個廣泛的用法。 for _, i := range []int{7, 42} { if r, e := f1(i); e != nil { fmt.Println("f1 failed:", e) } else { fmt.Println("f1 worked:", r) } } for _, i := range []int{7, 42} { if r, e := f2(i); e != nil { fmt.Println("f2 failed:", e) } else { fmt.Println("f2 worked:", r) } } // 你若是想在程序中使用一個自定義錯誤類型中的數據,你 // 須要經過類型斷言來獲得這個錯誤類型的實例。 _, e := f2(42) if ae, ok := e.(*argError); ok { fmt.Println(ae.arg) fmt.Println(ae.prob) } }
$ go run errors.go
f1 worked: 10 f1 failed: can't work with 42 f2 worked: 10 f2 failed: 42 - can't work with it 42 can't work with it