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累加数据,但当定时器结束之后,累加阻塞直到主程序结束。
Golang空通道(nil channels)教程_第1张图片

下面运行程序进行测试:

> go run start.go
143363459
> go run start.go
143901204

你可能感兴趣的:(Golang,golang,开发语言)