gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:14:32 26 4
gpt4 key购买 nike

我正在处理 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com