Go的接口+Error使用练习,正好里面还引入了一个小知识点,不要在Error()实现里面用Sprint一个实现了Error()的类型,因为Sprint里面会调用类型的Error(),无限循环。主要代码如下:
1 type ErrNegativeSqrt float64 2 3 func (e ErrNegativeSqrt) Error() string { 4 return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e)) 5 } 6 7 func Sqrt(x float64) (float64, error) { 8 if x < 0 { 9 return 0, ErrNegativeSqrt(x) 10 } 11 e, z := 1e-15, 1.0 12 for math.Abs(z*z-x) > e { 13 z -= (z*z - x) / (2 * z) 14 } 15 return z, nil 16 }
Sqrt的实现用的前面练习的内容。