2 回答

TA貢獻1824條經驗 獲得超5個贊
您必須區分變量的“靜態類型”和“動態類型”。
Go 中的每個變量都有一個靜態類型。一些例子:
在聲明is
a := 5
的靜態類型之后,關于.a
int
a
e
您代碼中的靜態類型是error
(因為這是errorGen
返回的)。您可以像這樣明確說明靜態類型
var b uint16 = 9
:
現在 Go 中有接口類型。error
是這樣的接口類型,請參閱彼得的回答。一些變量將具有error
靜態類型;你e
就是一個例子?,F在,接口類型變量的全部目的是存儲實現該接口的各種類型的值。因此,一個不是 nil 的接口變量以某種方式“包含”另一個變量(實際上是一個值)。此包含值的類型可以是實現接口的任何類型。包含值的類型是“動態類型”。類型斷言讓您可以提取此動態類型的值。

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)。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報