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

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

為什么golang自定義錯誤變量有多種類型

為什么golang自定義錯誤變量有多種類型

Go
吃雞游戲 2023-06-01 18:05:19
我是一個新的地鼠,如果我定義了一個自定義錯誤,我真的被變量類型搞糊涂了    import (        "fmt"        "reflect"    )    // custom errors    type myError struct {        msg string    }    func (m *myError) Error() string {        return m.msg    }    func errorGen() error {        return &myError{"custom error"}    }生成一個新錯誤并檢查它的類型    func main() {        e := errorGen()        fmt.Println(reflect.TypeOf(e).Kind()) // type = pointer        // first type assertion        _, ok := e.(error)        if ok {            fmt.Println("type assertion error") // type = error        }        // second type assertion        _, ok = e.(*myError)        if ok {            fmt.Println("type assertion *myError") // type = pointer        }    }所以在上面的代碼中,變量“e”同時顯示了兩種類型。e 的類型到底是什么?為什么“錯誤”是一個接口,也可以用作返回類型?非常感謝
查看完整描述

2 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

您必須區分變量的“靜態類型”和“動態類型”。

Go 中的每個變量都有一個靜態類型。一些例子:

  • 在聲明isa := 5的靜態類型之后,關于.ainta

  • e您代碼中的靜態類型是error(因為這是errorGen返回的)。

  • 您可以像這樣明確說明靜態類型var b uint16 = 9

現在 Go 中有接口類型。error是這樣的接口類型,請參閱彼得的回答。一些變量將具有error靜態類型;你e就是一個例子?,F在,接口類型變量的全部目的是存儲實現該接口的各種類型的值。因此,一個不是 nil 的接口變量以某種方式“包含”另一個變量(實際上是一個值)。此包含值的類型可以是實現接口的任何類型。包含值的類型是“動態類型”。類型斷言讓您可以提取此動態類型的值。


查看完整回答
反對 回復 2023-06-01
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

Go 編程語言規范

錯誤

預先聲明的類型錯誤定義為

type?error?interface?{
????Error()?string
????}

它是表示錯誤條件的常規接口,nil 值表示沒有錯誤。

接口類型

接口類型指定稱為其接口的方法集。接口類型的變量可以存儲任何類型的值,方法集是接口的任何超集。據說這樣的類型實現了接口。


e實現預先聲明的接口類型error。

? ? // first type assertion

? ? _, ok := e.(error)

? ? if ok {

? ? ? ? fmt.Println("type assertion error") // type = error

? ? }

e的具體類型是指向類型的指針myError。


? ? // second type assertion

? ? _, ok = e.(*myError)

? ? if ok {

? ? ? ? fmt.Println("type assertion *myError") // type = pointer

? ? }

兩種類型斷言都為真 ( okis true)。


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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