简述流程:
1、开启一个writeData 协程,向管道中写入50个整数
2、开启一个readData 协程,从管道intChan中读取writeData写入的数据
3、注意:write 和read 操作的是同一个管道
4、主线程需要等待writeData 和 readData协程都完成工作才能退出管道
流程图
流程注释:
- intChan 负责内容的写和读
- for 循环是为了防止协程还未读取完导致当前主线程关闭
代码实现:
package main
import (
"fmt"
)
// 向intChan中写入50个数据
func writeData(intChan chan int){
for i := 1; i < 50; i ++ {
intChan<-i
fmt.Println("writeData 写入数据", i)
}
close(intChan) // 这里如果不close readData就会发生死锁
}
// 再从intChan中读取50个数据,读取完后并向exitChan中写入一个True
func readData(intChan chan int, exitChan chan bool){
for {
v, ok := <-intChan
if !ok {
break // 50个数据读完后才break
}
fmt.Printf("readData 读到数据=%v \n", v)
}
exitChan <- true
close(exitChan)
}
func main() {
// 创建两个管道
intChan := make(chan int, 50)
exitChan := make(chan bool, 1)
go writeData(intChan)
go readData(intChan, exitChan)
// 这里的for是为了防止读协程还未读取完从而导致主线程关闭
// 因为读协程在读完50个数据后会往exitChan管道写入一个True,随后通过下面的for循环检测有没有True,从而确定要不要退出主线程
for {
_, ok := <-exitChan
if !ok {
break
}
}
}
我会两种语言,一种写给程序执行,一种说给你听.
来自LiuYoung的个人博客
Copyright © 冀ICP备20002380号
如果文章对你帮助,记得留下一个赞哦~~ |