Skip to main content
 首页 » 编程设计

Golang空通道(nil channels)教程

2022年07月19日120傻小

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

本文参考链接:https://blog.csdn.net/neweastsun/article/details/123010571
阅读延展