在Go中,设置流程退出代码的正确方法是什么?
我尝试将主要功能更改为
func main() int {
return -1
}
Run Code Online (Sandbox Code Playgroud)
但这会导致错误 func main must have no arguments and no return values
好的os.Exit(code int)
,但是这会立即中止进程并且不会干净地退出(例如,不运行延迟).
我还发现panic
将退出进程并将状态代码设置为非零,这可能是最好的方法,尽管它会将堆栈跟踪转储到控制台.
设置退出代码的正确方法是什么?
pet*_*rSO 11
让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
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello, ??
Another deferred func
[process exited with non-zero status]
Run Code Online (Sandbox Code Playgroud)
去游乐场:
http://play.golang.org/p/o0LfisANwb
"defer"语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,因为周围的函数执行了一个return语句,到达了它的函数体的末尾,或者因为相应的goroutine是恐慌.
DeferStmt ="延迟"表达式.
表达式必须是函数或方法调用; 它不能括号.对于表达式语句,内置函数的调用受到限制.
每次执行"延迟"语句时,将像往常一样评估调用的函数值和参数,并重新保存,但不执行实际的函数体.相反,延迟函数在周围函数返回之前立即执行,其顺序与延迟相反.