Go语言 美妙的channel(上)
2014-04-20 19:23
267 查看
在 Go
编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。
今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。
一个已经被关闭的 channel 永远都不会阻塞
第一个特性,我想谈一谈已经被关闭的 channel。当一个 channel 一旦被关闭,就不能再向这个 channel 发送数据,不过你仍然可以尝试从 channel 中获取值。能够检测 channel 是否关闭是一个很有用的特性,可用于对 channel 进行 range 操作,并且当 channel 清空后退出循环。
对于这个问题,一个很好的解决方案是利用已经被关闭的 channel 会实时返回这一机制。使用这个特性改写程序,现在包含了 100 个 goroutine,而无需跟踪 goroutine 生成的数量,或调整 finish channel 的大小。
在进入下一个话题前,再来看一个许多 Go 程序员都喜爱的简单示例。在上面的例子中,从未向 finish channel 发送数据,接受方也将收到的任何数据全部丢弃。因此将程序写成这样就很正常了:
一个 nil channel 永远都是阻塞的
我想谈的第二个特性正好与已经关闭的 channel 的特性正好相反。一个 nil channel;当 channel 的值尚未进行初始化或赋值为 nil 是,永远都是阻塞的。例如一个解决这个问题的安全的方法是利用 nil channel 的阻塞特性,并且将程序重写如下
在我的系统上运行得到
相关文章推荐
- Go语言 美妙的channel(下)
- go语言channel关注点
- [Go语言] 操作channel时遇到panic怎么办?
- Go语言_Go语言的channel
- TODO:Go语言goroutine和channel使用
- go语言之行--golang核武器goroutine调度原理、channel详解
- Go语言中的管道(Channel)总结
- Go语言中Channel机制
- Go语言 channel详解
- Go语言学习笔记(七)杀手锏 Goroutine + Channel
- go语言channel的别样用法
- Go语言里channel的死锁
- Go语言 channel如何实现归并排序中的merge函数详解
- Go语言中 Channel 详解
- Go语言 channel 管道 阻塞 死锁 经典问题
- Go语言的核心Routine-Channel
- Go语言的管道Channel用法
- Go 语言中 channel 使用总结
- GO语言练习:channel 缓冲机制
- TODO:Go语言goroutine和channel使用