源地址 https://tour.go-zh.org/methods/20
一、題目描述
從之前的練習中復制 Sqrt
函數,修改它使其返回 error
值。
Sqrt
接受到一個負數時,應當返回一個非 nil 的錯誤值。復數同樣也不被支持。
創建一個新的類型
type ErrNegativeSqrt float64
並為其實現
func (e ErrNegativeSqrt) Error() string
方法使其擁有 error
值,通過 ErrNegativeSqrt(-2).Error()
調用該方法應返回 "cannot Sqrt negative number: -2"
。
*注意:* 在 Error
方法內調用 fmt.Sprint(e)
會讓程序陷入死循環。可以通過先轉換 e
來避免這個問題:fmt.Sprint(float64(e))
。這是為什么呢?
修改 Sqrt
函數,使其接受一個負數時,返回 ErrNegativeSqrt
值。
二、分析
- 定義float64的類型ErrNegativeSqrt;
- 重寫Error方法。
三、Go代碼
package main import ( "fmt" "math" ) type ErrNegativeSqrt float64 //創建一個新的類型 func (e ErrNegativeSqrt) Error() string { return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e)) } func Sqrt(x float64) (float64, error) { if x < 0 { return 0, ErrNegativeSqrt(x) } return math.Sqrt(x), nil } func main() { fmt.Println(Sqrt(2)) fmt.Println(Sqrt(-2)) }
運行結果