Go 语言 channel 基础

avatar
作者
筋斗云
阅读量:0

        channel 是 Go 语言内建的 first-class 类型,也是 Go 语言与众不同的特性之一。何为 first-class ? 你可以这样理解,channel 类型和 int、struct、func 等一样,是 Go 的基础类型。Go 语言的 channel 设计精巧、简单,以至于有人用其他语言编写了类似于 Go 风格的 channel 库,比如 docker/libchan、tylertreat/chan,但是并不像 Go 语言一样把 channel 内置到语言规范中。

1. channel 的历史

        如果想了解 channel 这种 Go 语言中特有的数据结构,则要追溯到 CSP 模型,了解它的历史,以及它对 Go 的创始人设计 channel 类型的影响。

        CSP 是 Communicating Sequential Process 的简称,中文直译为 “通信顺序进程” ,或者叫作交换信息的循序进程,是用来描述并发系统中交互的一种模式。

        CSP 最早出现于计算机科学家 Tony Hoare 在 1978 年发表的论文中。最初,论文中提出的 CSP 版本在本质上不是一种进程演算,而是一种并发编程语言,但之后经过一系列的改进,最终发展并精炼出 CSP 理论。CSP 允许使用进程组件来描述系统,它们独立运行,并且只通过消息传递的方式通信。

        就像 Go 的创始人之一 Rob Pike 所说的,“每一个计算机程序员都应该读一读 Tony Hoare 在 1978 年发表的关于 CSP 的论文。” 他和 Ken Thompson 在设计 Go 语言时也深受此论文的影响,并将 CSP 理论真正应用于语言本身,通过引入 channel 这个新的类型来实现 CSP 的思路。

        channel 是 GO 语言内置的类型,你无须引入某个包,就能使用它。虽然 GO 也提供了传统的同步原语,但它们都是通过库的方式提供的,你必须要引入 sync 包或者 atomic 包才能使用它们。

        channel 和 Go 的另一个独特的特性 goroutine 一起为并发编程提供了优雅的、便利的、与传统并发控制不同的方案,并演化出很多并发模式。

2. channel 的应用场景

先来看一条 Go 语言中流传很广的谚语

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!