我想了解为什么会创建一个用于处理Go中的错误的类型以及如何确定它应该具有什么基础类型

dia*_*e17 7 types go

我正在通过巡回赛 - 练习:错误.当我向平方根函数添加错误处理时,它握着我的手.

这是我的解决方案:

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)

我有两个问题:

  1. 为什么ErrNegativeSqrt的基础类型为"float64"而不是"错误"?

  1. 为什么要首先创建一个类型?为什么我们创建一个错误类型并为其添加一个方法,而不仅仅是拥有一个独立的函数?

我是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)