Golang空通道(nil channels)教程

本文介绍Golang空通道特性,并通过示例说明它的特殊应用。

空通道特点

nil是pointers, interfaces, maps, slices, channels 和 function 类型的零值,表示未初始化值。nil不是未定义状态,它本身就是值。error是接口类型,因此error变量可以为nil,但string不能为nil。

下面我们看下nil 通道有什么特点,空通道对操作的反应如下:

  • 从空通道读会永远阻塞
  • 发送信息给空通道读会永远阻塞
  • 关闭通道会终止程序(panic)

总之,空通道是一种特殊通道,总是阻塞。对比非空已关闭的通道仍然可以进行读取,并能够读取对应类型的零值,但对于已关闭通过发送信息会终止程序。

下面通过一个示例进行说明。

应用示例

程序共包括四个部分,下面分别进行说明。

第一个部分包括一些导入包信息;

package main

import (
"fmt"
"math/rand"
"time"
)

第二部分定义一个函数addIntegers():

func addIntegers(c chan int) {
    sum := 0
    t := time.NewTimer(time.Second)
    for {
        select {
            case input := <-c:
                sum = sum + input
            case <-t.C:
                c = nil
                fmt.Println(sum)
        }
    }
}

addIntegers()函数首先定义了一个定时器,在for循环内部是select选择器,当定时器时间结束之后将执行第二个case,首先把通道c设置为空通道,使得不在接受任何信息并使得函数一直阻塞。

第三部分定义发送数据函数:

func sendIntegers(c chan int) {
    for {
        c <- rand.Intn(100)
    }
}

sendIntegers()函数一直生成随机数并发送给通道,直到c处于阻塞状态。

最后部分是主函数:

func main() {
    c := make(chan int)

    go addIntegers(c)
    go sendIntegers(c)

    time.Sleep(2 * time.Second)
}

首先定义通道,然后使用两个协程执行上述两个函数,为了防止主函数提前结束,我们让主函数睡眠2秒。
总体业务实现过程为,sendIntegers发送数据,addIntegers累加数据,但当定时器结束之后,累加阻塞直到主程序结束。
在这里插入图片描述

下面运行程序进行测试:

> go run start.go
143363459
> go run start.go
143901204
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值