3 回答

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)
}

TA貢獻1775條經驗 獲得超11個贊
通常不會創建自定義錯誤類型,但這是對錯誤如何工作以及其他一些 Go 概念的演示。
為什么 ErrNegativeSqrt 的底層類型是“float64”而不是“error”?
這允許將float64
值 inSqrt
直接轉換為錯誤。它還演示了新類型如何可以具有各種基礎類型,并且方法可以附加到結構以外的類型。如果您需要創建自己的錯誤類型,請使用最適合您的用例的基礎類型。
為什么首先要創建一個類型?為什么我們要創建一個錯誤類型并向其添加一個方法,而不是僅僅擁有一個獨立的函數?
有時,錯誤需要比從errors.New
, 或返回的單個字符串中包含的信息或上下文更多fmt.Errorf
。例如,net
包使用a net.OpError
(符合net.Error
接口)來打包地址信息,無論是臨時錯誤,還是超時引起的。
在大多數情況下,一個簡單的基于字符串的錯誤就足夠了。

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 中的鴨子類型。
- 3 回答
- 0 關注
- 212 瀏覽
添加回答
舉報