源地址 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)) }
運行結果

