前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang中log.Fatal()和panic和os.Exit()的区别

golang中log.Fatal()和panic和os.Exit()的区别

作者头像
素履coder
发布2022-02-17 14:43:11
2.4K0
发布2022-02-17 14:43:11
举报
文章被收录于专栏:素履coder

1.os.Exit()

Exit 导致当前程序以给定的状态代码退出。通常,代码零表示成功,非零表示错误。

程序立即终止,defer函数不会运行。

为了可移植性,状态码应该在 [0, 125] 范围内。

代码语言:javascript
复制
package main

import "os"

func main() {
	os.Exit(1)
}

//结果:
进程 已完成,退出代码为 1
代码语言:javascript
复制
package main

import "os"

func main() {
	os.Exit(0)
}

//结果:
进程 已完成,退出代码为 0

2.log.Fatal()

代码语言:javascript
复制
package main

import "log"

func main() {
	log.Println("1")
	defer func() {
		log.Println("2")
	}()
	log.Fatal("3")
	log.Println("4")
}

//结果:
2021/12/05 17:50:19 1
2021/12/05 17:50:19 3

进程 已完成,退出代码为 1

可见log.Fatal()会直接退出,但是会打印里面的内容,之前的 defer 函数不会运行

log.Fatal()的源码

代码语言:javascript
复制
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
	std.Output(2, fmt.Sprint(v...))
	os.Exit(1)
}

3.panic()

panic 内置函数停止当前 goroutine 的正常执行。当函数 F 调用 panic 时,F 的正常执行会立即停止。任何被 F 推迟执行的函数都以通常的方式运行,然后 F 返回给它的调用者。对于调用者 G,F 的调用就像调用 panic,终止 G 的执行并运行任何延迟函数。这一直持续到正在执行的 goroutine 中的所有函数都以相反的顺序停止。此时,程序以非零退出代码终止。这种终止序列称为恐慌,可以由内置函数 recover 控制。

代码语言:javascript
复制
package main

import "log"

func main() {
	log.Println("1")
	defer func() {
		log.Println("2")
	}()
	defer func() {
		log.Println("3")
	}()
	defer func() {
		log.Println("4")
	}()
	panic("5")
	log.Println("6")
}

//结果:
2021/12/05 17:57:51 1
2021/12/05 17:57:51 4
2021/12/05 17:57:51 3
2021/12/05 17:57:51 2
panic: 5

goroutine 1 [running]:
main.main()
        /Users/haha/kevin_go/src/go_learning/test.go:16 +0xa8

进程 已完成,退出代码为 2

可见,panic虽然会停止函数的执行,但是之前的 defer 函数可以正常运行,同时panic也会打印出里面的内容

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.os.Exit()
  • 2.log.Fatal()
  • 3.panic()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档