- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
07.3 类型断言
类型断言的表示方法是 x.(T)
,其中 x```是接口类型的变量,
T是要判断的类型。也就是说,存储在 `x
接口类型的变量中的实际值是T```类型,并且
T必须满足` x
的接口类型变量!以下的段落和代码示例,将澄清类型断言的这个相对不容易理解的概念。
类型断言做两件事:第一件事是检查接口类型变量是否是特定的类型,这样使用时,类型断言返回两个值:基础值和 bool
值。虽然基础值是您可能想要使用的值,但是布尔值告诉您类型断言是否成功!
类型断言所做的第二件事是允许您使用存储在接口中的具体值或将其分配给新变量。这意味着如果接口中有一个 int
变量,可以使用类型断言获取该值。
但是,如果类型断言不成功,并且没有处理该失败,那么您的程序将触发 panic
异常。接下来我们分两部分介绍 assertion.go
程序。第一部分包含以下Go代码:
> package main
>
> import (
> "fmt"
> )
>
> func main() {
> var myInt interface{} = 123
> k, ok := myInt.(int)
> if ok {
> fmt.Println("Success:", k)
> }
> v, ok := myInt.(float64)
> if ok {
> fmt.Println(v)
> } else {
> fmt.Println("Failed without panicking!")
> }
首先,声明 myInt
变量,该变量具有动态类型 int
和值 123
。然后使用类型断言测试两次 myInt
变量的接口类型 — 分别是 int
类型和 float64
类型。
由于 myInt
变量不包含 float64
值,因此类型断言 myInt.(float64)
执行时,如果没有恰当的处理,则会引发错误。因此在这种情况下,使用 ok
变量来判断类型断言是否成功,将使程序免于 panic
异常。
以下Go代码是 assertion.go
程序的第二部分:
> i := myInt.(int)
> fmt.Println("No cheking:", i)
> j := myInt.(bool)
> fmt.Println(j)
> }
这里有两种类型的断言。第一个类型断言是成功的,因此不会有任何问题。但是,让我们进一步回顾一下这个特定类型的断言。变量 i```的类型为
int``,其值为
123,存储在
myInt中。因此由于
int满足
myInt接口,并且
myInt接口不需要实现接口函数,所以
myInt.(int)的值是一个
int` 值。
然而第二个类型断言 myInt.(bool)
将触发 panic
异常,因为 myInt
的基础值不是布尔值( bool
)。因此执行 assertion.go
将生成以下输出:
$ go run assertion.go Success: 123 Failed without panicking! No cheking: 123 panic: interface conversion: interface {} is int, not bool goroutine 1 [running]: main.main() /Users/mtsouk/Desktop/masterGo/ch/ch7/code/assertion.go:25 +0x1d9 exit status 2
程序的执行结果明确的给出了触发 panic
异常的原因: interface{} is int, not bool
。
一般来说,在使用接口时,也应该使用类型断言。您马上会在 useInterface.go
程序中看到更多类型断言的使用案例。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论