zoukankan      html  css  js  c++  java
  • [GO]通道的关闭

    并不是往通道里放多少次数据,就必须取多次少数据的(之前的例子都是放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
  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9674599.html
Copyright © 2011-2022 走看看