揪出隐藏的代码

不能执行的 Go 代码是逻辑错误,因此由开发者或一个 Go 编译器的正常执行操作来解决这个问题是相当困难的。简单讲,除了无法执行此代码外,对于隐藏代码没有任何问题!

看一下下面保存在 cannotReach.go 中的代码:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func f1() int {
  6. fmt.Println("Entering f1()")
  7. return -10
  8. fmt.Println("Exiting f1()")
  9. return -1
  10. }
  11. func f2() int {
  12. if true {
  13. return 10
  14. }
  15. fmt.Println("Exiting f2()")
  16. return 0
  17. }
  18. func main() {
  19. fmt.Println(f1())
  20. fmt.Println("Exiting program...")
  21. }

cannotReach.go 的代码没有语法错误。因此,您可以执行 cannotReach.go,编译器不会报任何错误:

  1. $ go run cannotReach.go
  2. Entering f1()
  3. -1
  4. Exiting program...

注意程序中的 f2() 从来没有被执行。然而,这很容易猜到下面的 f2() 没有执行的原因是之前的 if 语句总是 true

  1. fmt.Println("Exiting f2()")
  2. return 0

因此,对于这个问题您能做什么呢?您可以执行下面的 go tool vet

  1. $ go tool vet cannotReach.go
  2. cannotReach.go:10: unreachable code

这个输出告诉我们有不可到达代码在程序的第10行。现在我们来从函数 f1() 中移除 return -10 语句,再执行 go tool vet

  1. $ go tool vet cannotReach.go

这里没有新的错误信息,尽管在 f2() 函数中仍有隐藏代码。这意味着 go tool vet 无法捕获每种可能的逻辑错误。