package main
import (
"fmt"
"os"
)
func main() {
exitCode := 0
defer func() { os.Exit(exitCode) }()
// Do whatever, including deferring more functions
defer func() {
fmt.Printf("Do some cleanup\n")
}()
func() {
fmt.Printf("Do some work\n")
}()
// But let's say something went wrong
exitCode = 1
// Do even more work/cleanup if you want
// At the end, os.Exit will be called with the last value of exitCode
}
输出量:
Do some work
Do some cleanup
Program exited: status 1.
5条答案
按热度按时间vjrehmav1#
我在大多数真实的的
main
包中都做了一些沿着的事情,以便尽快采用return err
约定,并有一个适当的终止:i7uaboj42#
在Python中,我通常使用一个模式,它被转换成Go语言时看起来像这样:
guykilcj3#
我认为最简单的方法是在
main
的顶部设置exitCode
,然后在下一步关闭defer
。这样你就可以在main
中的任何地方修改exitCode
,并且它的最后一个值将以如下方式退出:输出量:
前往Playgroundhttps://play.golang.org/p/AMUR4m_A9Dw
请注意,这样做的一个重要缺点是,您不会在设置错误代码后立即退出进程。
bjp0bcyl4#
正如fas所提到的,您有来自os包的
func Exit(exitcode int)
。但是,如果需要应用defered函数,则始终可以使用
defer
关键字,如下所示:http://play.golang.org/p/U-hAS88Ug4
你执行所有的操作,影响一个错误变量,在最后,当一切都被清理干净,你可以安全地退出。
否则,您也可以使用panic/recover:http://play.golang.org/p/903e76GnQ-
当你遇到错误时,你会恐慌,在你捕捉(恢复)它的地方结束你的清理。
6ojccjat5#
是的,实际上,操作系统包提供了这个。
http://golang.org/pkg/os/#Exit
编辑:看起来你知道Exit。这篇文章给出了Panic的概述,它会让延迟函数在返回前运行。将它与exit结合使用可能是你想要的。http://blog.golang.org/defer-panic-and-recover