- 前言
- 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 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
11.10 揪出隐藏的代码
不能执行的 Go 代码是逻辑错误,因此由开发者或一个 Go 编译器的正常执行操作来解决这个问题是相当困难的。简单讲,除了无法执行此代码外,对于隐藏代码没有任何问题!
看一下下面保存在 cannotReach.go
中的代码:
package main
import (
"fmt"
)
func f1() int {
fmt.Println("Entering f1()")
return -10
fmt.Println("Exiting f1()")
return -1
}
func f2() int {
if true {
return 10
}
fmt.Println("Exiting f2()")
return 0
}
func main() {
fmt.Println(f1())
fmt.Println("Exiting program...")
}
cannotReach.go
的代码没有语法错误。因此,您可以执行 cannotReach.go
,编译器不会报任何错误:
$ go run cannotReach.go
Entering f1()
-1
Exiting program...
注意程序中的 f2()
从来没有被执行。然而,这很容易猜到下面的 f2()
没有执行的原因是之前的 if
语句总是 true
:
fmt.Println("Exiting f2()")
return 0
因此,对于这个问题您能做什么呢?您可以执行下面的 go tool vet
:
$ go tool vet cannotReach.go
cannotReach.go:10: unreachable code
这个输出告诉我们有不可到达代码在程序的第10行。现在我们来从函数 f1()
中移除 return -10
语句,再执行 go tool vet
:
$ go tool vet cannotReach.go
这里没有新的错误信息,尽管在 f2()
函数中仍有隐藏代码。这意味着 go tool vet
无法捕获每种可能的逻辑错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论