揪出隐藏的代码

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

最后编辑: kuteng  文档更新时间: 2021-03-27 20:14   作者:kuteng