A Tour of Go 55 Exercise: Errors

演習:以前実装した Sqrt 関数を error の値を返すように修正。

注意: Error メソッド中で、 fmt.Print(e) を呼び出すことは、無限ループにプログラムが陥ることでしょう。

 もちろん無限ループの実装を最初に書きましたよw;

package main

import (
    "fmt"
)

func square(x float64) float64 {
    return x*x
}

func abs(x float64) float64 {
    ret := 0.0
    if x >= 0 {
        ret = x
    } else {
        ret = -x
    }
    return ret
}

func enough(x,y float64) bool {
    const tolerance = 0.0001
    return abs(x-y) > tolerance 
}

type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
    
    // e throw exception, if not cast to float64
    
    return fmt.Sprintf("cannot Sqrt negative number: %v",float64(e))
}

func Sqrt(f float64) (float64, error) {
    if f < 0.0 {
        return 0.0, ErrNegativeSqrt(f)
    }
    
    z := 1.0
    for pz := 0.0 ; enough(pz,z);{
        pz = z
        z -= ((square(z) - f)/(2*z))
    }
    return z, nil
}

func main() {
    fmt.Println(Sqrt(2))
    fmt.Println(Sqrt(-2))
}