欢迎光临散文网 会员登陆 & 注册

Go有意思小问题汇集

2023-04-11 09:55 作者:清澄秋爽  | 我要投稿

有缓冲的channel没有读完,close后还能继续读出里面的内容吗?

可以!

读取多次可以依次拿到之前写入的值,直到最后读完,继续读则得到对应channel类型的0值



golang之channel入门

channel需要注意的点:

  • 关闭一个nil channel 会导致程序panic

  • channel关闭之后,仍然可以从channel中读取剩余的数据,直到数据全部读取完成。读取完后继续读,得到的将是对应类型的零值.

  • 而如果继续向已关闭的channel发送数据,会引起panic

  • channel不能关闭两次,否则会panic


A->B->C三个祖孙协程,B耗时最短,B执行结束后,C还会继续执行吗?


即 Go中父协程与子协程的生命周期问题

结论:

1. 当父协程是main协程时,父协程退出,父协程下的所有子协程也会跟着退出; (当main协程结束时,子协程也是会被终止掉的)

输出:


2. 当父协程不是main协程时,父协程退出,父协程下的所有子协程并不会跟着退出(子协程直到自己的所有逻辑执行完或者是main协程结束才结束)

go中父协程与子协程的生命周期(子协程能否使用主协程变量)



子协程panic,主协程还能不能正常运行? 主协程里的recover,能捕获子协程的panic吗?

不能


主协程里的recover,能捕获子协程的panic吗?

不能~

对于goroutine中的panic,协程外面的recover是无法恢复的;goroutine中的recover,同样无法恢复协程外的panic

Go异常处理机制panic和recover


recover哪些情况下阻止不了程序崩溃?


不能~

  • 并发读写 map

  • 堆栈内存耗尽(如递归)

  • 将 nil 函数作为 goroutine 启动

  • goroutines 死锁

  • 线程限制耗尽

  • 超出可用内存

会报fatal error:xxxxxxxx

recover能捕获所有错误吗?



Go有意思小问题汇集的评论 (共 条)

分享到微博请遵守国家法律