本文介绍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()

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

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

最后部分是主函数:

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