我正在通过练习:错误进行工作。当我将错误处理添加到平方根函数时,它握住了我的手。
这是我的解决方案:
package main
import (
"fmt"
"math"
)
type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string {
fmt.Sprint(float64(e))
return fmt.Sprintf("cannot Sqrt negative number: %g", float64(e))
}
func Sqrt(x float64) (float64, error) {
z := 1.0
margin := 0.00000000000001
for {
if x < 0 {
return 0, ErrNegativeSqrt(x)
}
previousZ := z
z = z - (z*z-x)/(2*z)
if math.Abs(previousZ-z) < margin {
fmt.Println(previousZ, "-", z, "=", previousZ-z)
break
}
}
fmt.Println("math.Sqrt:", math.Sqrt(x))
return z, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}
我在了解这条线时遇到了麻烦:
type ErrNegativeSqrt float64
我有两个问题:
和
我是Go的初学者,我想了解。太感谢了。
我要先回答第二个问题:在类型中添加一个方法,以便ErrNegativeSqrt实现错误接口,这意味着其他不了解ErrNegativeSqrt细节的代码可以将其用作任何其他错误。
由于错误接口仅需要带有返回类型为string的方法Error(),因此要使用的常见类型只是具有返回该字符串的Error方法的字符串(在包“ errors”中定义)。
我不知道为什么在这种情况下决定使用float64作为错误类型,但是我看到的主要优点是,如果您有多个可以返回相似错误的函数,则必须执行以下操作:
func Method1() error{
...
return errors.New(fmt.Sprintf("cannot Sqrt negative number: %g", number)
}
func Method2() error{
...
return errors.New(fmt.Sprintf("cannot Sqrt negative number: %g", number2)
}
并对需要返回类似结果的任何函数重复此操作。使用您发布的代码,您仅在创建错误时声明负责该错误的数字,并且方法“ Error()”将返回所有字符的格式化字符串。
func Method1() error{
...
ErrNegativeSqrt(number)
}
func Method2() error{
...
ErrNegativeSqrt(number)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句