GO语言基础进阶教程:关闭通道和通道上范围循环

本文深入探讨了Go语言中的通道操作,包括如何关闭通道以及如何通过范围循环安全地接收数据。当发送者关闭通道后,接收者可以检查通道状态,避免无效的读取。示例代码展示了如何在接收时检测通道是否关闭,以及如何利用for range循环从通道中读取数据直至通道关闭。

一、 关闭通道

发送者可以通过关闭信道,来通知接收方不会有更多的数据被发送到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 main
​
import (
    "fmt"
    "time"
)
​
func main()  {
    ch1 := make(chan int)
    go sendData(ch1)
    /*
    子goroutine,写出数据10个
            每写一个,阻塞一次,主程序读取一次,解除阻塞
​
    主goroutine:循环读
            每次读取一个,堵塞一次,子程序,写出一个,解除阻塞
​
    发送发,关闭通道的--->接收方,接收到的数据是该类型的零值,以及false
     */
    //主程序中获取通道的数据
    for{
        time.Sleep(1*time.Second)
        v, ok := <- ch1 //其他goroutine,显示的调用close方法关闭通道。
        if !ok{
            fmt.Println("已经读取了所有的数据,", ok)
            bre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值