亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我想了解為什么要創建一種類型來處理 Go 中的錯誤,以及您如何決定它應該具有什么基礎類型

我想了解為什么要創建一種類型來處理 Go 中的錯誤,以及您如何決定它應該具有什么基礎類型

Go
繁星coding 2021-12-20 19:13:21
我正在完成A Tour of Go - 練習:錯誤。當我向平方根函數添加錯誤處理時,它握住了我的手。這是我的解決方案:package mainimport (    "fmt"    "math")type ErrNegativeSqrt float64func (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我有兩個問題:為什么 ErrNegativeSqrt 的底層類型是“float64”而不是“error”?和為什么首先要創建一個類型?為什么我們要創建一個錯誤類型并向其添加一個方法,而不是僅僅擁有一個獨立的函數?我是 Go 的初學者,我想了解一下。太感謝了。
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

我將首先回答您的第二個問題:您向類型添加一個方法,以便 ErrNegativeSqrt 實現錯誤接口,這意味著不了解 ErrNegativeSqrt 細節的其他代碼可以將其用作任何其他錯誤。


由于錯誤接口只需要一個返回類型為字符串的方法 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)

}


查看完整回答
反對 回復 2021-12-20
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

通常不會創建自定義錯誤類型,但這是對錯誤如何工作以及其他一些 Go 概念的演示。

為什么 ErrNegativeSqrt 的底層類型是“float64”而不是“error”?

這允許將float64值 inSqrt直接轉換為錯誤。它還演示了新類型如何可以具有各種基礎類型,并且方法可以附加到結構以外的類型。如果您需要創建自己的錯誤類型,請使用最適合您的用例的基礎類型。

為什么首先要創建一個類型?為什么我們要創建一個錯誤類型并向其添加一個方法,而不是僅僅擁有一個獨立的函數?

有時,錯誤需要比從errors.New, 或返回的單個字符串中包含的信息或上下文更多fmt.Errorf。例如,net包使用a net.OpError(符合net.Error接口)來打包地址信息,無論是臨時錯誤,還是超時引起的。

在大多數情況下,一個簡單的基于字符串的錯誤就足夠了。


查看完整回答
反對 回復 2021-12-20
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

像任何其他語言一樣,我們創建一個類型或對象來為我們自己的利益和功能分組(計算機不關心)。在 Go 中,創建自定義類型或結構類型來擴展對象的功能是很常見的。


在這種情況下,創建類型ErrNegativeSqrt實際上可以float64通過添加方法來擴展功能。例如,比較這兩種方法:


func TimesTwo(val int) int {

        return val * 2

}


type SuperChargedInt int


func (sc SuperChargedInt) TimesTwo() int {

        return int(sc) * 2

}

a 不是將 an 傳遞int給函數,而是SuperChargedInt具有作用于自身的能力。當您進入界面時,這變得非常方便。


type MyInt interface {

        TimesTwo() int

}


type IntA int

type IntB int


func (a IntA) TimesTwo() int {

        return int(a) * 2

}


func (b IntB) TimesTwo() int {

        return int(b) * (1 + 1)

}


func PrintMyInt(c MyInt) {

        fmt.Println(c)

}

類型IntA和IntB滿足接口,MyInt因為它們都實現了所需的方法,可以在需要 的代碼中的任何地方使用MyInt。


var a IntA = 34

var b IntB = 32

PrintMyInt(a)

PrintMyInt(b)


type SomeNum struct {

        A MyInt

}


num := SomeNum{ A: a }

理解了接口,現在回到ErrNegativeSqrt類型,Error()給它添加方法,讓類型實現error接口(只有一個方法Error()要實現)?,F在你可以在任何地方像錯誤一樣使用類型。


這是 Golang 中的鴨子類型。


查看完整回答
反對 回復 2021-12-20
  • 3 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號