网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

goroutine/channel(2)

package main

import "fmt"

func main() {

    dataChan := make(chan int, 5)
    syncChan1 := make(chan struct{}, 1)
    syncChan2 := make(chan struct{}, 2)

    //演示接收操作
    go func() {
        <- syncChan1
        for {
            if elem, ok := <- dataChan; ok {
                fmt.Printf("Received: %d [receiver]\n", elem)
            } else {
                break
            }
        }
        fmt.Println("Done. [receiver]")
        syncChan2 <- struct{}{}
    }()

    //演示发送操作
    go func() {
        for i := 0; i < 5; i++ {
            dataChan <- i
            fmt.Printf("Sent: %d [sender]\n", i)
        }
        close(dataChan)
        syncChan1 <- struct{}{}
        fmt.Println("Done. [sender]")
        syncChan2 <- struct{}{}
    }()

    <-syncChan2
    <-syncChan2

}

输出:
Sent: 0 [sender]
Sent: 1 [sender]
Sent: 2 [sender]
Sent: 3 [sender]
Sent: 4 [sender]
Done. [sender]
Received: 0 [receiver]
Received: 1 [receiver]
Received: 2 [receiver]
Received: 3 [receiver]
Received: 4 [receiver]
Done. [receiver]

创新互联于2013年成立,先为徐州等服务建站,徐州等地企业,进行企业商务咨询服务。为徐州企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

Process finished with exit code 0

调用close函数可以关闭一个通道。但是,这样做的时候一定要特别注意:试图向一个已经关闭的通道发送元素时,会让发送操作引起运行时恐慌。因此,你总是应该保证安全的前提下关闭通道。这会设计到一些技巧,比如for语句和select语句。无论怎样都不应该在接收端关闭通道。因为在接收端通常无法判断发送端是否还会向该通道发送元素。另一方面,在发送端关闭通道一般不会对接收端的接收操作产生什么影响。如果通道在被关闭时其中仍然有元素,你依然可以接收表达式取出,并根据该表达式的第二个结果判断通道是否已无元素可取。
上面的例子:在发送方,我在向通道dataChan发送完所有元素并关闭通道后,才告知接收方开始接收。虽然通道已经关闭,但是对接收操作并无影响,接收方依然可以在接收完所有元素后自行结束。
最后还有两点要注意:
1.对弈同一个通道,仅允许关闭一次,对通道的重复关闭会引发运行恐慌。
2.在调用close函数时,你需要把代表欲关闭的那个通道的变量作为参数传入。如果此时该变量的值为nil,就会引发运行时恐慌

单向channel:
一个只进步出的通道没有任何意义。其实,单项通道应由双向通道变换而来,我们可以用这种变换来约束程序对通道的使用方式:


标题名称:goroutine/channel(2)
网页路径:http://bjjierui.cn/article/iihgdo.html

其他资讯