案例: 思路分析: 代码实现:
package main import "fmt" func writeData(intChan chan int) { for i := 1; i <= 50; i++ { intChan <-i//放入数据 fmt.Println("writeData",i) } close(intChan) } func readData(intChan chan int, exitChan chan bool) { for{ v, ok := <-intChan if !ok{ 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{ _, ok := <-exitChan if !ok{ break } } }
执行结构如下图:
读和写,频率不一样,也没有问题,代码如下:
package main import ( "fmt" "time" ) func writeData(intChan chan int) { for i := 1; i <= 50; i++ { intChan <-i//放入数据 fmt.Println("writeData",i) } close(intChan) } func readData(intChan chan int, exitChan chan bool) { for{ v, ok := <-intChan if !ok{ break } time.Sleep(time.Second) fmt.Printf("readData 读到数据=%v\n", v) } exitChan<- true close(exitChan) } func main() { //创建两个管道 intChan := make(chan int, 10) exitChan := make(chan bool, 1) go writeData(intChan) go readData(intChan,exitChan) for{ _, ok := <-exitChan if !ok{ break } } }
执行结果如下: 注意:如果只向管道写入数据,而没有读取,就会出现阻塞而deadlock。
Go语言 gorutine和channel协同工作经典应用案例介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。
原文链接:https://blog.csdn.net/cui_yonghua/article/details/94720208?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163523372016780265481777%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163523372016780265481777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-10-94720208.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450