我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者。
欢迎关注我哟~每周五6点按时送达~我的第「220」篇原创敬上大家好,我是Z哥。
最近用Golang进行编码也有3个月了,说来惭愧,到现在还没正儿八经深入学习一下Golang,一直被工作赶着往前在跑。
最近正好在工作中遇到一个问题,需要对Golang中的goroutine和panic&recover稍做深入的了解,算是忙里偷闲学习一下。
对goroutine的底层细节就不展开了,网上有不少相关的文章解读,如果你愿意的话,也可以去扒一下Golang的源码。
简单对goroutine进行一下概括就是:goroutine实现了M:N的线程模型,是协程的一种实现。
golang内置的调度器,可以让多核CPU中每个CPU执行一个协程。
单从表现来看,你可以将goroutine看作是java之类编程语言中的多线程的运行效果。
好了,那么问题来了:goroutine中发生panic会怎样?话不多说,实践是检验真理的唯一标准,我们直接上手coding。
funcmain(){gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){panic(panicingoroutine.)}运行代码的结果如下:可以看到,整个程序都崩了。
那么,如果在goroutine里的goroutine发出panic呢?也是一样的效果,程序崩了。
可能你会觉得整个程序之所以会崩,是因为异常被层层上抛到主线程导致的,其实并非如此。
在Golang中,任何地方发生的任意一个panic,都会直接程序退出。
那么怎么才能让程序不退出呢?通过调用recover()方法来捕获panic并恢复将要崩掉的程序。
funcmain(){gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){//recover()必须要和defer配合一起用,确保一旦执行到该方法体,这里定义的defer方法一定会被执行,哪怕是发生了panic。
deferfunc(){err:=recover()iferr!=nil{fmt.Printf(recoverreceiveaerr:%+v\n,err)}}()panic(panicingoroutine.)}执行上面的代码,结果如下:可以看到,程序没有再崩了。
那么新的问题又来了,能不能把recover()放到最外层的方法里,这样可以更好地实现一次recover()覆盖当前方法其下所有的panic。
funcmain(){deferfunc(){err:=recover()iferr!=nil{fmt.Printf(recoverreceiveaerr:%+v\n,err)}}()gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){panic(panicingoroutine.)}运行之后的结果:竟然还是崩了。
如果你是一位Java或者.Net的程序员习惯了try-catch-finally的运行效果肯定对这个结果比较意外。
在父方法定义的recover()竟然无法捕获到子方法里的panic。
其实这里的原因是,外层方法中定义的recover()无法捕获通过goroutine执行的子方法中抛出的panic。
在上面的代码中,我们把gopanicInGoroutine()前面的go去掉就可以正常捕获了。
好了,那么根据以上这些信息得到的处理panic的正确姿势是什么呢?必须通过defer关键字来调用recover()。
当通过goroutine调用某个方法,一定要确保内部有recover()机制。
如果你想进一步深入了解panic和recover的机制,分享你一个超棒的硬核视频:,第一遍看可能会有点晕,建议反复看,直到完全理解其原理。
推荐阅读:2023,我的巨变之年记一次Golang踩坑RabbitMQ也可以「关注」我,带你以技术思维看世界~想更进一步和我一起玩耍,欢迎「搜索微信公号:跨界架构师」。
内容包括:架构设计丨分布式系统丨产品丨运营丨个人深度思考。
我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者。
欢迎关注我哟~每周五6点按时送达~我的第「220」篇原创敬上大家好,我是Z哥。
最近用Golang进行编码也有3个月了,说来惭愧,到现在还没正儿八经深入学习一下Golang,一直被工作赶着往前在跑。
最近正好在工作中遇到一个问题,需要对Golang中的goroutine和panic&recover稍做深入的了解,算是忙里偷闲学习一下。
对goroutine的底层细节就不展开了,网上有不少相关的文章解读,如果你愿意的话,也可以去扒一下Golang的源码。
简单对goroutine进行一下概括就是:goroutine实现了M:N的线程模型,是协程的一种实现。
golang内置的调度器,可以让多核CPU中每个CPU执行一个协程。
单从表现来看,你可以将goroutine看作是java之类编程语言中的多线程的运行效果。
好了,那么问题来了:goroutine中发生panic会怎样?话不多说,实践是检验真理的唯一标准,我们直接上手coding。
funcmain(){gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){panic(panicingoroutine.)}运行代码的结果如下:可以看到,整个程序都崩了。
那么,如果在goroutine里的goroutine发出panic呢?也是一样的效果,程序崩了。
可能你会觉得整个程序之所以会崩,是因为异常被层层上抛到主线程导致的,其实并非如此。
在Golang中,任何地方发生的任意一个panic,都会直接程序退出。
那么怎么才能让程序不退出呢?通过调用recover()方法来捕获panic并恢复将要崩掉的程序。
funcmain(){gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){//recover()必须要和defer配合一起用,确保一旦执行到该方法体,这里定义的defer方法一定会被执行,哪怕是发生了panic。
deferfunc(){err:=recover()iferr!=nil{fmt.Printf(recoverreceiveaerr:%+v\n,err)}}()panic(panicingoroutine.)}执行上面的代码,结果如下:可以看到,程序没有再崩了。
那么新的问题又来了,能不能把recover()放到最外层的方法里,这样可以更好地实现一次recover()覆盖当前方法其下所有的panic。
funcmain(){deferfunc(){err:=recover()iferr!=nil{fmt.Printf(recoverreceiveaerr:%+v\n,err)}}()gopanicInGoroutine()//以下3行代码是为了让控制台挂起,等待gorouine运行完毕。
fmt.Println(wait)input:=bufio.NewScanner(os.Stdin)input.Scan()}funcpanicInGoroutine(){panic(panicingoroutine.)}运行之后的结果:竟然还是崩了。
如果你是一位Java或者.Net的程序员习惯了try-catch-finally的运行效果肯定对这个结果比较意外。
在父方法定义的recover()竟然无法捕获到子方法里的panic。
其实这里的原因是,外层方法中定义的recover()无法捕获通过goroutine执行的子方法中抛出的panic。
在上面的代码中,我们把gopanicInGoroutine()前面的go去掉就可以正常捕获了。
好了,那么根据以上这些信息得到的处理panic的正确姿势是什么呢?必须通过defer关键字来调用recover()。
当通过goroutine调用某个方法,一定要确保内部有recover()机制。
如果你想进一步深入了解panic和recover的机制,分享你一个超棒的硬核视频:,第一遍看可能会有点晕,建议反复看,直到完全理解其原理。
推荐阅读:2023,我的巨变之年记一次Golang踩坑RabbitMQ也可以「关注」我,带你以技术思维看世界~想更进一步和我一起玩耍,欢迎「搜索微信公号:跨界架构师」。
内容包括:架构设计丨分布式系统丨产品丨运营丨个人深度思考。
目录
- 1 3级片
- 2 将军家的小娘子免费全集在线观看
- 3 无限看片在线观看完整版免费
- ▪ 一周的朋友在线观看电影
- ▪ 四虎成人精品影院
- 4 世界上最不安分的人
- ▪ 在线碰
- ▪ 寂寞刺激得难受的聊天软件
- 5 回魂夜电影无删减版免费观看国语
- 6 刺青电视剧
- ▪ 银河铁道之夜
- ▪ 18限漫画
- ▪ 禁忌女孩免费泰剧
- 7 舌害电视剧全集免费观看
- ▪ 国产成人综合亚洲欧美在
- ▪ wwww.8888
- ▪ 色婷婷在线播放
- ▪ 继承者计划在线观看免费高清
- ▪ 好想去你的世界爱你电影
- 8 国产成人综合亚洲不卡
- ▪ 青山知可子电影
- ▪ 欧美黑白配
- ▪ 韩国电影外出
- ▪ 林正英僵尸片全部电影免费观看
- ▪ 巴掌印PO
- ▪ 情事韩国在线观看
- ▪ 亲爱的翻译官电视剧免费观看全集高清
- ▪ 韩国电影三级hd中文字幕
- 9 医生为什么不建议查过敏源
- ▪ 欧美一区二区三区
- ▪ 不说再见电视剧
- ▪ 奇葩说第三季
- 10 漂亮妈妈电影完整版
- ▪ 日韩电影毛片
- ▪ 菠萝视频网站
- ▪ 善良的秘书在线观看
- ▪ 最新泰剧2022热播泰剧在线观看
- ▪ 暴走看啥片
- 11 狼太郎
- ▪ 禁止的爱善良的小中文在线bd
- ▪ 黄页网站大全免费观看
- ▪ 禁忌书屋
- ▪ 年轻的母亲动漫
- ▪ 法证先锋3国语
- 12 韩国伦理电影情事在线观看到哪里能看到
- 13 秋霞电影伦理
- 14 年年岁岁柿柿红
泰坦尼克号未删减完整版在线观看《泰坦尼克号未删减完整版在线观看》由来
编辑泰坦尼克号未删减完整版在线观看《泰坦尼克号未删减完整版在线观看》起源