func close(c chan<- Type)
内建函数close关闭信道,该通道必须为双向的或只发送的。它应当只由发送者执行,而不应由接收者执行,其效果是在最后发送的值被接收后停止该通道。在最后的值从已关闭的信道中被接收后,任何对其的接收操作都会无阻塞的成功。对于已关闭的信道,语句:
x, ok := <-c
还会将ok置为false。
需求
请完成goroutine和channel协同工作的案例,具体要求:
1)开启一个writeData协程,向管道intChan中写入50个整数.
2)开启一个readData协程,从管道intChan中读取writeData写入的数据。
3) 注意:writeData和readDate操作的是同一个管道
4) 主线程需要等待writeData和readDate协程都完成工作才能退出
思路分析
代码
// goroutine + channel 案例package mainimport ("fmt")// write datafunc writeData(intChan chan int) {for i := 1; i <= 50; i++ {intChan <- ifmt.Printf("写入数据: %v \n", i)}close(intChan)}// read datafunc readData(intChan chan int, exitChan chan bool) {for {v, ok := <-intChanif !ok {break} else {fmt.Printf("读到数据了: %v \n", v)}}exitChan <- trueclose(exitChan)}func main() {// 创建两个管道intChan := make(chan int, 50)exitChan := make(chan bool, 1)go writeData(intChan)go readData(intChan, exitChan)// time.Sleep(time.Second * 10)// 阻塞的方式for {v, ok := <-exitChanif !ok {break} else {fmt.Printf("结束了: %v \n", v)}}fmt.Println("over~")}
阻塞机制
读和写不同步也不会报错,但是写入之后必须读取,否则会 deadlock
不受读写快慢的影响
写入之后不读取,会造成阻塞,channel里的数据永远不会释放,协程就永远被占用,deadlock(不知道是不是这样-_-)
作业一
作业二

