码迷,mamicode.com
首页 > 其他好文 > 详细

[GO]通道的关闭

时间:2018-09-19 16:25:47      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:接收   结束   就是   没有   port   package   ann   else   print   

并不是往通道里放多少次数据,就必须取多次少数据的(之前的例子都是放3次取3次,放10次取10次),我们可以做一个操作,当子协程没有新放入的时候,主协程不再去取,这就是关闭通道

package main

import "fmt"

//channel并不像文件那样需要经常去关闭它,只有当你确实没有任何发送数据了,或者是你想显示的结束range循环之类的,才去关闭channel
//关闭channel后,无法向channel再发送数据(引发panic错误后导致接收立即返回零值)
//关闭channel后,可以继续向channel接收数据
//对于nil channel,无论收发都会被阻塞

func main() {
    ch := make(chan int)
    go func() {
        for i:=0; i<5; i++ {
            ch <- i
        }
        close(ch) //关闭channel
    }()
    for true {
        //如果OK为true,则说明通道没有关闭
        if num, ok := <-ch; ok==true{
            fmt.Println("num = ", num)
        }else {
            break
        }
    }
  //上面的这段死循环也可以使用下面的实现,更简便
  for num := range ch {
  fmt.Printf("num = ", num)
  }
}

执行结果

num =  0
num =  1
num =  2
num =  3
num =  4

 

[GO]通道的关闭

标签:接收   结束   就是   没有   port   package   ann   else   print   

原文地址:https://www.cnblogs.com/baylorqu/p/9674599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!