我正在通过巡回赛 - 练习:错误.当我向平方根函数添加错误处理时,它握着我的手.
这是我的解决方案:
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))
}
Run Code Online (Sandbox Code Playgroud)
我无法理解这条线:
type ErrNegativeSqrt float64
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
和
我是Go的初学者,我想了解.非常感谢.
小智 4
我将首先回答你的第二个问题:你向你的类型添加一个方法,以便 ErrNegativeSqrt 实现错误接口,这意味着不知道 ErrNegativeSqrt 细节的其他代码可以将其用作任何其他错误。
由于错误接口只需要一个返回类型为字符串的方法 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)
}
Run Code Online (Sandbox Code Playgroud)
并对任何需要返回类似内容的函数重复此操作。使用您发布的代码,您只需在创建错误时声明负责错误的数字,并且方法“Error()”返回所有错误的格式化字符串。
func Method1() error{
...
ErrNegativeSqrt(number)
}
func Method2() error{
...
ErrNegativeSqrt(number)
}
Run Code Online (Sandbox Code Playgroud)