go - 我想了解为什么要创建一种类型来处理 Go 中的错误以及您如何决定它应该具有的基础类型

标签 go types

我正在处理 A Tour of Go - Exercise: Errors .当我向平方根函数添加错误处理时,它会握住我的手。

这是我的解决方案:

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

我有两个问题:

  1. 为什么 ErrNegativeSqrt 的底层类型是“float64”而不是“error”?

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

我是 Go 的初学者,我想了解一下。非常感谢。

最佳答案

我要先回答你的第二个问题:你给你的类型添加了一个方法,所以 ErrNegativeSqrt 实现了 error interface ,这意味着不知道 ErrNegativeSqrt 细节的其他代码可以将其用作任何其他错误。

由于错误接口(interface)只需要一个返回类型为字符串的方法 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)
}

关于go - 我想了解为什么要创建一种类型来处理 Go 中的错误以及您如何决定它应该具有的基础类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35998040/

相关文章:

c++ - 使用 sizeof 获得两个的最大幂

c# - 在静态方法中调用非静态 GetType()?

python - 在 python 中使用非标准类型进行类型转换

mysql - 如何从 GO 在 mysql 中创建触发器。似乎不支持使用 DELIMITER

regex - guid 的正则表达式

xml - 在 Go 中编码元素中的任意 XML 属性?

Haskell,字符串与...字符串?

generics - 符合 Swift 协议(protocol)的泛型类型

go - 向 Docker 中的 Golang 应用程序发送信号

go - Beego中如何设置字符串列的默认值