赞
踩
本文介绍Golang空通道特性,并通过示例说明它的特殊应用。
nil是pointers, interfaces, maps, slices, channels 和 function 类型的零值,表示未初始化值。nil不是未定义状态,它本身就是值。error是接口类型,因此error变量可以为nil,但string不能为nil。
下面我们看下nil 通道有什么特点,空通道对操作的反应如下:
总之,空通道是一种特殊通道,总是阻塞。对比非空已关闭的通道仍然可以进行读取,并能够读取对应类型的零值,但对于已关闭通过发送信息会终止程序。
下面通过一个示例进行说明。
程序共包括四个部分,下面分别进行说明。
第一个部分包括一些导入包信息;
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。