版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hero82748274/article/details/88265539
今晚带着一点疑问记录一下下午在做项目过程遇到的问题。当两个协程先后书写的时候会出现什么现象?
发现时候,当通道写入数据的时候,读取后另外一个就收不到。
package main
import (
"fmt"
"time"
)
var msg = make(chan int, 10)
//Go的练习
func main() {
fmt.Println("程序开始")
go msgHandler(100)
go msgHandler(200)
msg <- 300
time.Sleep(5 * time.Second)
}
func msgHandler(value int) {
for {
select {
case <-msg:
fmt.Println("收到消息", value)
}
}
}
现象
从上面的代码 连续 编写两个协程,都执行同一件事,但是第二个没有打印出来?为什么
分析
晚上特意请教了一下同事,他的回复是第一个协程已经将数据读取出来了,第二个协程依旧做同一件事,通道里面数据早已经被读取出来,恢复了空。所以第二个协程就没有收到数据,因此第二个协程就触发不了。
如果把代码修改调整为以下的方式,于是两个协程里面的数据就被打印出来了。
func main() {
fmt.Println("程序开始")
go msgHandler(100)
go msgHandler(200)
msg <- 300
msg <- 300
time.Sleep(5 * time.Second)
}
先将笔记记录下来,理解起来还是需要一点时间。