golang善用go func和defer

本文探讨了Golang中的错误处理机制,重点在于`error`与`panic`的区别。`error`用于处理可预见的错误,而`panic`用于不可预见的错误,通常与`defer`和`recover`结合使用来确保资源的正确释放。`panic`会顺序执行当前goroutine的已defer函数,但不能捕获其他协程的panic。同时,介绍了在子协程中使用`go func()`和`defer`来处理异常情况,强调了`defer`的使用策略和潜在成本。
摘要由CSDN通过智能技术生成

一、error与panic:

  • error:可预见的错误
  • panic:不可预见的错误,panic一般通过defer中的recover()捕获
    对于有风险的代码,若发生panic则会导致程序异常退出,例如数组越界。
1. panic的操守
  • panic是有秩序的,退出之前会执行完先处理完当前goroutine已经defer【挂上去】的任务,若某个defer在panic之后,则不会被执行。
  • panic仅保证当前goroutine下的defer都会被调到,但不保证其他协程的defer也会调到
  • 同一goroutine下的已经挂上去的多个defer,回溯执行,即先进后出

例如:

func main() {
	defer fmt.Println("defer main") 
	var user = os.Getenv("USER_")
	go func() {
		defer fmt.Println("defer caller")
		func() {
			defer func() {
				fmt.Println("defer here")
			}()

			if user == "" {
				panic("should set user env.")
			}
		}()
	}()

	time.Sleep(1 * time.Second)
	fmt.Printf("get result")
}

//result:
defer here
defer caller
panic: should set user env.
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值