Go语言 gorutine和channel协同工作经典应用案例 (Golang经典编程案例)

案例:
Go语言 gorutine和channel协同工作经典应用案例 (Golang经典编程案例)_第1张图片
思路分析:
Go语言 gorutine和channel协同工作经典应用案例 (Golang经典编程案例)_第2张图片
代码实现:

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
		}
	}
}

执行结构如下图:
Go语言 gorutine和channel协同工作经典应用案例 (Golang经典编程案例)_第3张图片

读和写,频率不一样,也没有问题,代码如下:

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
		}
	}
}

执行结果如下:
Go语言 gorutine和channel协同工作经典应用案例 (Golang经典编程案例)_第4张图片
注意:如果只向管道写入数据,而没有读取,就会出现阻塞而deadlock。

你可能感兴趣的:(Go语言经典编程案例)