go学习笔记(14)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

}

在这里插入图片描述

先将笔记记录下来,理解起来还是需要一点时间。

猜你喜欢

转载自blog.csdn.net/hero82748274/article/details/88265539