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

1.os.Exit()

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

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

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

package main


import "os"


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


//结果:
进程 已完成,退出代码为 1
package main


import "os"


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


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

2.log.Fatal()

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()的源码

// 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 控制。

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也会打印出里面的内容。

bd8d110f0117aad04c1feb9cc98629cd.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值