概述
并发编程是利用多核心能力,提升程序性能,而多线程之间需要相互协作、共享资源、线程安全等。任何并发模型都要解决线程间通讯问题,毫不夸张的说线程通讯是并发编程的主要问题。go使用著名的CSP(Communicating Sequential Process,通讯顺序进程)并发模型,从设计之初 Go 语言就注重如何在编程语言层级上设计一个简洁安全高效的抽象模型,让程序员专注于分解问题和组合方案,而且不用被线程管理和信号互斥这些繁琐的操作分散精力。channel是线程简通讯的具体实现之一,本质就是一个线程安全的 FIFO 阻塞队列(先进先出),向队列中写入数据,在另一个线程从队列读取数据。很多语言都有类似实现,比如 Java 的线程池任务队列。
基本使用
通道是引用类型,需要使用 make 创建,格式如下- 通道实例 := make(chan 数据类型, 通道长度)
复制代码
- 数据类型:通道内传输的元素类型,可以基本数据类型,也可以使自定义数据类型。
- 通道实例:通过make创建的通道句柄,与函数名称一样,指向通道的内存首地址。
- 通道长度:通道本质是队列,创建时候可指定长度,默认为0
创建通道- ch1 := make(chan int) // 创建一个整型类型的通道
- ch2 := make(chan interface{}) // 创建一个空接口类型的通道, 可以存放任意格式
- ch3 := make(chan *Equip) // 创建Equip指针类型的通道, 可以存放*Equip
- ch4 := make(chan *Equip, 10) // 创建Equip指针类型的通道, 并指定队列长度
复制代码 通道本质就是线程安全的队列,创建时候可以指定队列长度,默认为0。
向通道写入数据,使用语法非常形象,写入channel |