内容简介:对于这个示例代码中的一些问题总结:一个可以让你停下来看一看,在茶歇之余给你帮助的小站,这里的内容主要是后端技术,个人管理,团队管理,以及其他个人杂想。
背景
defer func() {
fmt.Println("defer start...")
if err := recover(); err != nil {
fmt.Printf("err1:%v\n", err)
}
fmt.Println("defer end...")
}()
c := make(chan int)
// var c chan int
go func() {
// defer func() {
// if err := recover(); err != nil {
// fmt.Printf("err2:%v\n", err)
// }
// }()
c <- 1
}()
// 以下两行代码对调的话,运行就正常了,否则会 panic
close(c)
fmt.Println(<-c)
for i := 0; i < 100; i++ {
cc, ok := <-c
if ok {
fmt.Println(cc)
}
// fmt.Println(<-c)
}
对于这个示例代码中的一些问题总结:
- goroutine 里面的 panic ,在外面是不能被 recover() 的。
- chan 是阻塞式的。
- 从已关闭的 chan 读数据永远不会阻塞,一律返回空值。
- 向已关闭的 chan 以任何形式写数据都会 panic。
- 如果我们先调用
go func() {c <- 1}(),然后关闭 chan,此时再读取 chan 是有可能成功读取到数据,但是系统调度到执行 go func (即当我们向关闭的chan send 数据时,会报错 panic: send on closed channel)。
- 如果我们先调用
- defer 只针对当前协程有效。
- 当主函数都执行完了,函数中的协程也没执行完,并且 chan 关闭,再在协程中写数据, recover() 是不会报错的,因为我主函数执行完都还没有执行到协程中 chan 写数据。
- 当主函数未执行完就执行协程中的写数据,并且在写之前 chan 已经关闭,则会执行 defer,但是 recover() 没有捕捉到错误,因为错误发生在另外一个协程中。
- 关闭一个 nil channel 会发生 panic。
参考资料
茶歇驿站
一个可以让你停下来看一看,在茶歇之余给你帮助的小站,这里的内容主要是后端技术,个人管理,团队管理,以及其他个人杂想。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C程序设计的抽象思维
Eric S.Roberts / 闪四清 / 机械工业出版社 / 2012-5 / 99.00元
Eric S. Roberts所著的《C程序设计的抽象思维》是一本关于C语言的经典图书。本书共计17章,分为4部分,第一部分概述计算机导论课程中涉及的基本编程概念;第二部分讨论递归算法,其中结合大量示例,有助于读者轻松理解和掌握晦涩的概念;第三部分不仅介绍了用非递归算法实现的抽象数据类型,还提供了一些工具,有助于读者理解数据抽象的概念;第四部分重点介绍采用递归算法实现的抽象数据类型。本书重点突出,......一起来看看 《C程序设计的抽象思维》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
RGB CMYK 转换工具
RGB CMYK 互转工具