文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
类型断言
对于接口类型 x 和类型 T,主要表达式:
x.(T)
可以断言 x 不是 nil 且 x 的值是 T 类型。标记 x.(T) 叫做类型断言。
更确切的说,如果 T 不是接口类型,那么 x.(T) 将会断言动态类型 x 的类型是不是 T。
这时,T 必须实现了 x 的(接口)类型。否则断言会是非法的因为 x 不能保存 T 类型的值。如果 T 是接口类型,那么可以断言动态类型 x 是否实现了 T 接口。
如果类型断言成功,表达式的值为 x 的值,但它的类型是 T。如果断言失败,将会导致运行时恐慌。换句话说,即使 x 是运行时确定的,x.(T) 也必须是编程时就确认存在的。
var x interface{} = 7 // x 拥有动态类型 int 值为 7
i := x.(int) // i 为 int 类型值为 7
type I interface { m() }
func f(y I) {
s := y.(string) // 非法: 字符串没有实现接口 I (缺少 m 方法)
r := y.(io.Reader) // r 拥有接口 io.Reader 所以 y 的动态类型必须同时实现 I 和 io.Reader
…
}
类型断言可以使用特定格式的赋值和初始化语句。
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
var v, ok T1 = x.(T)
这时将会额外生成一个无类型的布尔值。如果断言成功,ok 返回 true
,否则是 false
。并且 v 会是 T 类型的零值。这时不会有恐慌发生。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论