返回介绍

类型断言

发布于 2024-10-12 12:51:51 字数 963 浏览 0 评论 0 收藏 0

对于接口类型 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文