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的实现用的前面练习的内容。