栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

第011节:关闭通道和通道上范围循环

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一、 关闭通道

发送者可以通过关闭信道,来通知接收方不会有更多的数据被发送到channel上。

close(ch)

接收者可以在接收来自通道的数据时使用额外的变量来检查通道是否已经关闭。

语法结构:

v, ok := <- ch  

类似map操作,存储key,value键值对

v,ok := map[key] //根据key从map中获取value,如果key存在, v就是对应的数据,如果key不存在,v是默认值

在上面的语句中,如果ok的值是true,表示成功的从通道中读取了一个数据value。如果ok是false,这意味着我们正在从一个封闭的通道读取数据。从闭通道读取的值将是通道类型的零值。

例如,如果通道是一个int通道,那么从封闭通道接收的值将为0。

示例代码:

package mainimport (    "fmt"    "time")func main()  {    ch1 := make(chan int)    go sendData(ch1)        //主程序中获取通道的数据    for{        time.Sleep(1*time.Second)        v, ok := <- ch1 //其他goroutine,显示的调用close方法关闭通道。        if !ok{            fmt.Println("已经读取了所有的数据,", ok)            break        }        fmt.Println("取出数据:",v, ok)    }    fmt.Println("main...over....")}func sendData(ch1 chan int)  {    // 发送方:10条数据    for i:=0;i<10 ;i++  {        ch1 <- i//将i写入通道中    }    close(ch1) //将ch1通道关闭了。}

运行结果


第011节:关闭通道和通道上范围循环

在上面的程序中,send Goroutine将0到9写入chl通道,然后关闭通道。主函数里有一个无限循环。它检查通道是否在发送数据后,使用变量ok关闭。如果ok是假的,则意味着通道关闭,因此循环结束。还可以打印接收到的值和ok的值。

二、通道上的范围循环

我们可以循环从通道上获取数据,直到通道关闭。for循环的for range形式可用于从通道接收值,直到它关闭为止。

使用range循环,示例代码:

package mainimport (    "time"    "fmt")func main()  {    ch1 :=make(chan int)    go sendData(ch1)    // for循环的for range形式可用于从通道接收值,直到它关闭为止。    for v := range ch1{        fmt.Println("读取数据:",v)    }    fmt.Println("main..over.....")}func sendData(ch1 chan int)  {    for i:=0;i<10 ; i++ {        time.Sleep(1*time.Second)        ch1 <- i    }    close(ch1)//通知对方,通道关闭}

运行结果:


第011节:关闭通道和通道上范围循环
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/793672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号