揪出隐藏的代码
不能执行的 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
无法捕获每种可能的逻辑错误。