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)) }