Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 不应该';无法标记操作系统退出后无法访问的代码_Go - Fatal编程技术网

Go 不应该';无法标记操作系统退出后无法访问的代码

Go 不应该';无法标记操作系统退出后无法访问的代码,go,Go,去1.12号窗口 将fmt.Println放在os.Exit之后而不是之前, 这不应该得到编译器故障或至少警告吗 package main import ( "fmt" "os" ) func main() { fmt.Println("Hello, playground") os.Exit(0) fmt.Println("Good By, playground") } 就像任何其他函数一样,编译器不应该知道它终止了应用程序,因此后面的其余代码是无法

去1.12号窗口

将fmt.Println放在os.Exit之后而不是之前, 这不应该得到编译器故障或至少警告吗

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Hello, playground")
    os.Exit(0)
    fmt.Println("Good By, playground")
}
就像任何其他函数一样,编译器不应该知道它终止了应用程序,因此后面的其余代码是无法访问的
os.Exit()。更不用说你也可以创建一个函数来调用其中的一个,编译器应该在多大程度上检测全部或大部分

更进一步说,Go编译器既不会检测也不会标记“真正”无法访问的代码。使用
return
语句时,编译器甚至可以看到以下变化:

func main() {
    fmt.Println("Hello, playground")
    return
    fmt.Println("Good By, playground")
}
然而,它编译和运行都很好,并且输出(在上尝试):

因此,编译器不会检测到无法访问的代码,但会检测到,go vet也会运行,因此您可以看到应用程序的输出前缀为:

./prog.go:10:2: unreachable code
Go vet exited.
这是以前提过的,请参见。Robert Grisemer的回答是:

一般来说,Go的理念不是不惜一切代价保护程序员不受其错误的影响。不为无法访问的代码引发错误是经过深思熟虑的。这也不是一种常见的错误。此外,为调试引入早期返回通常很有用,这可能会导致大量无法访问的代码。目前尚不清楚其利大于弊

未使用的变量与Go在短变量声明中的重新声明机制相结合,可能会导致细微的错误查找-因此未使用变量的错误消息。这是一种从经验演变而来的机制,是解决具体问题的务实办法

报告未使用的导入是因为它有助于控制依赖关系—这是大规模系统设计中的一个重要工具,并且作为一个副作用,它还可以保持编译速度。这也是一个非常深思熟虑的设计决策

最后,使死代码成为错误将是一个重大的语言变化,这在目前是不可能的

使用GoVet


它可能会被linter捕获,但编译器并不关心语义。您有3个函数调用,这是合法的。你不能在
返回之后再加上更多的代码,但对于编译器
操作系统来说,退出
只是另一个函数。@Adrian实际上在Go中,在
返回之后加上代码
@icza很抱歉,你是对的,我忘了在
开始运行之前运行
去检查
./prog.go:10:2: unreachable code
Go vet exited.