在Go中设置流程退出代码的正确方法是什么?
我尝试将主要功能更改为
func main() int {
return -1
}
但这会导致错误func main must have no arguments and no return values
确定有os.Exit(code int)
,但这会立即中止进程并且不会干净地退出(例如,不会运行延迟)。
我还发现panic
将退出进程并将状态代码设置为非零,这可能是最好的方法,尽管它会将堆栈跟踪转储到控制台。
设置退出代码的正确方法是什么?
答案 0 :(得分:10)
使os.Exit
执行最后一个延迟函数。延迟函数在周围函数返回之前立即执行,其延迟顺序相反。例如,
package main
import (
"fmt"
"os"
)
func main() {
code := 0
defer func() {
os.Exit(code)
}()
defer func() {
fmt.Println("Another deferred func")
}()
fmt.Println("Hello, 世界")
code = 1
}
输出:
Hello, 世界
Another deferred func
[process exited with non-zero status]
去游乐场:
http://play.golang.org/p/o0LfisANwb
The Go Programming Language Specification
“defer”语句调用其执行被延迟到的函数 周围函数返回的那一刻,要么是因为 周围函数执行了一个return语句,到了结尾 它的功能体,或者因为相应的goroutine 恐慌。
DeferStmt =“延迟”表达。
表达式必须是函数或方法调用;它不可能是 括号。内置函数的调用受到限制 表达陈述。
每次执行“defer”语句时,函数值和 呼叫的参数照常评估并重新保存,但是 实际的功能体未执行。相反,延迟函数是 在周围函数返回之前执行,在 相反的顺序,他们被推迟。