设置退出流程代码的正确方法?

Gre*_*nis 8 go

在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

Go编程语言规范

推迟发言

"defer"语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,因为周围的函数执行了一个return语句,到达了它的函数体的末尾,或者因为相应的goroutine是恐慌.

DeferStmt ="延迟"表达式.

表达式必须是函数或方法调用; 它不能括号.对于表达式语句,内置函数的调用受到限制.

每次执行"延迟"语句时,将像往常一样评估调用的函数值和参数,并重新保存,但不执行实际的函数体.相反,延迟函数在周围函数返回之前立即执行,其顺序与延迟相反.

  • 很不错!我什至没有想到这是一种可能性。 (2认同)