2 回答
TA贡献1824条经验 获得超5个赞
您必须区分变量的“静态类型”和“动态类型”。
Go 中的每个变量都有一个静态类型。一些例子:
在声明is
a := 5
的静态类型之后,关于.a
int
a
e
您代码中的静态类型是error
(因为这是errorGen
返回的)。您可以像这样明确说明静态类型
var b uint16 = 9
:
现在 Go 中有接口类型。error
是这样的接口类型,请参阅彼得的回答。一些变量将具有error
静态类型;你e
就是一个例子。现在,接口类型变量的全部目的是存储实现该接口的各种类型的值。因此,一个不是 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 关注
- 95 浏览
添加回答
举报