类型断言被用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。
类型断言的语法定义如下:
PrimaryExpression 可以在 Go 语言规范中找到,并且它可以是标识符,特定索引的数组元素,切片等等。
Type 既可以是类型标识符,也可以是类型字面量,比如:
PrimaryExpression 必须是接口类型,否则就会产生一个编译时错误:
如果表达式为 nil,类型断言就不会成立。
动态类型
变量除了有静态类型外(变量声明中的类型),接口变量还有动态类型。就是在当前接口类型变量中设置的一种类型的值。在程序执行的过程当中,接口类型的变量具有相同的静态类型,但是其动态类型会随着其实现的接口不同,而其值也会随之改变。
接口类型
如果 T 来自 v.(T) 是一个接口类型,这样的断言检查,可以用来检测 v 的动态类型是否实现了接口 T:
非接口类型
如果 T 来自 v.(T) 不是接口类型,这样断言检查动态类型 v 是否与 T 类型相同:
在非接口类型情况下进行类型传递就必须实现接口 I,如果不满足这个要求的话就会在编译时被捕获:
输出:
不要 panic
在上述情况下,当断言不能成立时,运行时 panic 将会被触发。为了优雅的处理错误,这里有特殊的形式来赋值或者初始化:
输出:
当断言不成立时,第一个值将会作为测试类型的零值
资源:
go 编程语言规范- go 编程语言
Go 是一个通用语言,设计时考虑了系统编程。它是强类型的并且具有垃圾回收机制…
golang.org
via: https://medium.com/golangspec/type-assertions-in-go-e609759c42e1
作者:Michał Łowicki
译者:fredvence
校对:rxcai
本文由 GCTT 原创编译,Go 中文网 荣誉推出
领取专属 10元无门槛券
私享最新 技术干货