Golang中引入error介面類型作為錯誤處理的標準模式,如果函數要返回錯誤,則傳回值類型列表中肯定包含error。error處理過程類似於C語言中的錯誤碼,可逐層返回,直到被處理。
error基本用法
error 類型實際上是抽象了 Error() 方法的 error介面,Golang使用該介面進行標準的錯誤處理。
error對應原始碼如下:
type error interface {
Error() string
}
這個設計也正好體現了Go哲學中的“正交”理念:error context與error類型的分離。無論error context是int、float還是string或是其他,統統用error作為傳回值類型即可。
一般情況下,如果函數需要返回錯誤,就將 error 作為多個傳回值中的最後一個(但這並非是強制要求)。
我們來用一個開方函數簡單示範下 Go 語言中 error 的用法:
func Sqrt(f float64) (float64, error) {
if f < 0 {
return -1, errors.New("math: square root of negative number")
}
return math.Sqrt(f) , nil
}
func main(){
result, err:= Sqrt(-13)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}
以上是 error 的使用方法:使用errors.New 可返回一個錯誤資訊。與其他語言的異常相比,Golang 的方法相對更加容易、直觀。
error進階用法
除了上面的errors.New 用法之外,我們也可以實現error介面,自己實現Error() 方法,來達到自訂參數的錯誤輸出。
type dualError struct {
Num float64
problem string
}
func (e dualError) Error() string {
return fmt.Sprintf("Wrong!!!,because \"%f\" is a negative number",e.Num)
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return -1, dualError{Num:f}
}
return math.Sqrt(f) , nil
}
func main(){
result, err:= Sqrt(-13)
if err != nil {
fmt.Println(err)
}else{
fmt.Println(result)
}
}