golang 用defer 捕获error 需小心


有时一个函数内需要根据最后是否出错,决定是否执行某个操作。这时候如果函数的分支又比较多,就会比较麻烦了。
defer 处理这个情况刚好合适


func main() {
	var err error

	byErr(&err)

	defer byErr(&err)

	defer func(err *error) {
		byErr2(*err)
	}(&err)

	err = errors.New("hi,beautiful girl")
	byErr(&err)

}

func byErr(err *error) {
	if *err != nil {
		log.Println("is err")
	}else {
		log.Println("is nil")
	}
}

func byErr2(err error) {
	if err != nil {
		log.Println("is err")
	}else {
		log.Println("is nil")
	}
}


结果如下

2019/06/21 09:25:43 is nil
2019/06/21 09:25:43 is err
2019/06/21 09:25:43 is err
2019/06/21 09:25:43 is err

代码里两种方法都是可行的,但需要注意的是,稍不注意 照以下方式用 就bug了:

1,如果直接用 err 作为参数,会,恒为nil
2,如果用err 的指针作为参数, 会恒不为 nil


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM