package main
import (
"fmt"
)
type ErrFloat float64
func (e ErrFloat ) Error() string{
return fmt.Sprintf("cannot Sqrt negative number: %v",e)
}
func Sqrt(x float64) (float64, error) {
if x<0 {
return 0,ErrNegativeSqrt(x)
}
return 1, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}
fmt.Println(Sqrt(-2))出错无输出
原理:
ErrFloat实现了Error接口成为Error类型,
打印时会调用e.Error()拿到错误信息,
因此fmt.Sprintln(e)等价于fmt.Sprintln(e.Error()).
然而e.Error()又会调用fmt.Sprintln(e),
然后就出现无限递归的死循环了.
怎么解决呢?
可以fmt.Sprintln(e)修改为fmt.Sprintln(float64(e))