Golang中return后不可达代码的处理方法(go vet命令)
Golang中return后不可达代码的处理方法(go vet命令) “go vet”命令会提示存在无法访问的代码。 我希望程序能执行到最后,但却遇到了无法访问的代码的问题。 如何在 for 循环中返回…
//main.go
package main
import "fmt"
func main() {
var inputs string
fmt.Println("Please enter the characters,Valid characters:【go】")
fmt.Scan(&inputs)
fmt.Println(returnfunc(inputs))
}
func returnfunc(input string)(a string){
switch input {
case "go":
message := "golang will start!"+"Go is a tool for managing Go source code..."
return message
default:
messageerror := "ERROR: " + input + " is an invalid error Target method: Take a close look at the valid code,【 go 】 is valid"
return messageerror
}
for {
folang := input
fmt.Println("start for")
return folang
}
fmt.Println("Ended.")
return
}
更多关于Golang中return后不可达代码的处理方法(go vet命令)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
如果我从函数中返回,后续的处理就无法执行,我的理解对吗?
更多关于Golang中return后不可达代码的处理方法(go vet命令)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我很高兴能理解为什么在return之后无法继续执行处理。非常感谢 ^ ^
你说得对。因此,我们只能说警告不应被忽视,并且可能很有帮助。
你的 for 循环只运行一次,然后就从函数返回了。
这就是为什么:1. 它后面的代码是不可达的;2. 外层的 for 循环是不必要的。
此外,你的两个 switch 分支都已经有返回语句,所以连 for 循环本身也是不可达的。
这样的代码无法编译。请看这个例子:
package main
import (
"fmt"
)
func foo() {
fmt.Println("before")
return
fmt.Println("after") // <-- 无法访问的代码
}
func main() {
foo()
}
Go编译器会提示:
./prog.go:10:2: unreachable code
lutzhorn:
这样的代码无法编译。
你的示例代码可以编译,因为它是合法的代码。
这段代码被 vet 报告为包含可疑结构:unreachable code。
Vet 检查 Go 源代码并报告可疑的结构,例如参数与格式字符串不匹配的 Printf 调用。Vet 使用启发式方法,不能保证所有报告都是真正的问题,但它可以发现编译器未捕获的错误。
$ cat reach.go
package main
import (
"fmt"
)
func foo() {
fmt.Println("before")
return
fmt.Println("after") // <-- unreachable code
}
func main() {
foo()
}
.
$ go version
go version devel +e82c9bd8 Wed Sep 16 08:49:14 2020 +0000 linux/amd64
$ go run reach.go
before
$ go vet reach.go
# command-line-arguments
./reach.go:10:2: unreachable code
$
./prog.go:10:2: unreachable code
Go vet exited.
before
在Go语言中,go vet命令检测到的不可达代码确实需要处理。在你的代码中,for循环和最后的fmt.Println("Ended.")都是不可达的,因为函数在switch语句中已经通过return语句返回了。
以下是修改后的代码示例,展示了如何在for循环中正确返回:
package main
import "fmt"
func main() {
var inputs string
fmt.Println("Please enter the characters,Valid characters:【go】")
fmt.Scan(&inputs)
fmt.Println(returnfunc(inputs))
}
func returnfunc(input string) (a string) {
// 使用变量存储结果
var result string
switch input {
case "go":
message := "golang will start!" + "Go is a tool for managing Go source code..."
result = message
default:
messageerror := "ERROR: " + input + " is an invalid error Target method: Take a close look at the valid code,【 go 】 is valid"
result = messageerror
}
// 现在for循环可以正常执行
for i := 0; i < 3; i++ {
fmt.Println("start for loop iteration", i+1)
// 可以在循环中修改结果
if i == 2 {
result = result + " (processed in loop)"
}
}
fmt.Println("Ended.")
return result
}
或者,如果你希望在特定条件下从循环中返回,可以这样写:
func returnfunc(input string) (a string) {
// 直接在循环中处理逻辑
for i := 0; i < 5; i++ {
fmt.Println("Loop iteration:", i+1)
if input == "go" && i == 2 {
return "Returning early from loop: golang started!"
}
if input != "go" && i == 1 {
return "Returning early: invalid input - " + input
}
}
// 默认返回
fmt.Println("Ended.")
return "Default return after loop completion"
}
如果你想要无限循环并在特定条件下返回:
func returnfunc(input string) (a string) {
count := 0
for {
count++
fmt.Println("Loop iteration:", count)
if input == "go" {
return "Found 'go' after " + fmt.Sprint(count) + " iterations"
}
if count >= 3 {
break // 跳出循环而不是直接返回
}
}
fmt.Println("Ended.")
return "Input '" + input + "' not found in 3 iterations"
}
关键点是:确保函数的执行路径能够到达所有代码段,避免在函数早期使用return语句导致后续代码不可达。go vet会检测到这种问题并给出警告。



