我想了解为什么要创建一个类型来处理Go中的错误,以及如何确定它应具有的基本类型

dianafaye17

我正在通过练习:错误进行工作当我将错误处理添加到平方根函数时,它握住了我的手。

这是我的解决方案:

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”而不是“错误”?

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

我是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

人们为什么要声明一个为其分配的对象的基本类型的变量?

来自分类Dev

当我创建一个函数来处理xhrhttp请求时,如何解决未捕获的类型错误?

来自分类Dev

为什么要创建一个方法类型对象,我想要一个类型列表对象

来自分类Dev

具有基本类型的编译错误以及接口的通用方法的实现

来自分类Dev

如何创建自定义类型以始终表示具有一定数量元素的某些基本类型的数组?

来自分类Dev

当我具有基本类型的另一个属性的BsonId属性时,是否可以在派生类中使用“ Id”属性?

来自分类Dev

如何快速创建一个 Network 类来处理我所有的数据库 Firestore 操作并且可以从任何视图控制器调用?

来自分类Dev

为什么数组中的元素可以更改值,但基本类型的值不能更改?(无法找到一个好标题,对不起)

来自分类Dev

是否有一个经验法则来确定对象在OO编程中应具有的粒度?

来自分类Dev

为什么要创建具有父类类型的变量

来自分类Dev

如何检查基本类型列表是否至少包含某些子类型的一个实例

来自分类Dev

什么是(fnptr)*类型以及如何创建它?

来自分类Dev

从其基本类型创建一个超级对象(Grails)

来自分类Dev

如何修复 webpack 错误:“你可能需要一个合适的加载器来处理这种文件类型。” 当我使用 webpack 加载 css 文件时

来自分类Dev

为什么在Java中不使用int基本类型

来自分类Dev

为什么在Java中不使用int基本类型

来自分类Dev

我可以拥有一个对象类型的 ArrayList ,它具有指向 Java 中对象的指针列表吗?

来自分类Dev

有什么方法可以获取某个类型的成员以及所有后续基本类型的成员?

来自分类Dev

为什么删除return会给我一个错误:预期类型`()`但找到了类型

来自分类Dev

为什么删除return会给我一个错误:预期类型`()`但找到了类型

来自分类Dev

如何定义一个函数来接受所有扩展通用基本类型的类型(Scala,下面的特定代码)?

来自分类Dev

为什么NSUserDefaults说我要添加非属性列表对象?它只是一个具有NSDictionary,NSNumber和NSData的NSArray

来自分类Dev

有没有一种方法可以在TypeScript中创建扩展基本类型的名义类型?

来自分类Dev

为什么我要创建一个只有`PhantomData <()>成员的结构?

来自分类Dev

我不了解尝试使此数组问题正常工作时应具有的特定变量类型或利用率类型

来自分类Dev

在接受基本类型的函数中处理派生类型

来自分类Dev

TypeScript:引用从一个基本类型扩展的不同类型的多个对象

来自分类Dev

为什么我收到类型错误:“function_name”不是一个函数

来自分类Dev

为什么拥有类型的集合会生成一个ID,我该如何避免呢?

Related 相关文章

  1. 1

    人们为什么要声明一个为其分配的对象的基本类型的变量?

  2. 2

    当我创建一个函数来处理xhrhttp请求时,如何解决未捕获的类型错误?

  3. 3

    为什么要创建一个方法类型对象,我想要一个类型列表对象

  4. 4

    具有基本类型的编译错误以及接口的通用方法的实现

  5. 5

    如何创建自定义类型以始终表示具有一定数量元素的某些基本类型的数组?

  6. 6

    当我具有基本类型的另一个属性的BsonId属性时,是否可以在派生类中使用“ Id”属性?

  7. 7

    如何快速创建一个 Network 类来处理我所有的数据库 Firestore 操作并且可以从任何视图控制器调用?

  8. 8

    为什么数组中的元素可以更改值,但基本类型的值不能更改?(无法找到一个好标题,对不起)

  9. 9

    是否有一个经验法则来确定对象在OO编程中应具有的粒度?

  10. 10

    为什么要创建具有父类类型的变量

  11. 11

    如何检查基本类型列表是否至少包含某些子类型的一个实例

  12. 12

    什么是(fnptr)*类型以及如何创建它?

  13. 13

    从其基本类型创建一个超级对象(Grails)

  14. 14

    如何修复 webpack 错误:“你可能需要一个合适的加载器来处理这种文件类型。” 当我使用 webpack 加载 css 文件时

  15. 15

    为什么在Java中不使用int基本类型

  16. 16

    为什么在Java中不使用int基本类型

  17. 17

    我可以拥有一个对象类型的 ArrayList ,它具有指向 Java 中对象的指针列表吗?

  18. 18

    有什么方法可以获取某个类型的成员以及所有后续基本类型的成员?

  19. 19

    为什么删除return会给我一个错误:预期类型`()`但找到了类型

  20. 20

    为什么删除return会给我一个错误:预期类型`()`但找到了类型

  21. 21

    如何定义一个函数来接受所有扩展通用基本类型的类型(Scala,下面的特定代码)?

  22. 22

    为什么NSUserDefaults说我要添加非属性列表对象?它只是一个具有NSDictionary,NSNumber和NSData的NSArray

  23. 23

    有没有一种方法可以在TypeScript中创建扩展基本类型的名义类型?

  24. 24

    为什么我要创建一个只有`PhantomData <()>成员的结构?

  25. 25

    我不了解尝试使此数组问题正常工作时应具有的特定变量类型或利用率类型

  26. 26

    在接受基本类型的函数中处理派生类型

  27. 27

    TypeScript:引用从一个基本类型扩展的不同类型的多个对象

  28. 28

    为什么我收到类型错误:“function_name”不是一个函数

  29. 29

    为什么拥有类型的集合会生成一个ID,我该如何避免呢?

热门标签

归档