channel
# 概述
Go语言的并发模型是CSP,提倡通过通信共享内存而不是通过共享内存而实现通信。 如果说goroutine是Go程序并发对执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。 Go语言中的通道channel是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出的原则,保证收发数据的顺序,每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。
channel是一种类型,一种引用类型,通道类型的空值是nil。声明通道类型的格式如下:
var ch1 chan int
var ch2 chan bool
var ch3 chan []int //声明一个传递int切片的通道
1
2
3
2
3
# channel操作
通道有发送(send)、接收(receive)和关闭(close)三种操作。 发送和接收都使用<-符号
关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。
关闭后的通道有以下特点:
- 对一个关闭的通道再发送值就会导致panic
- 对一个关闭的通道进行接收会一直获取值直到通道为空
- 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值
- 关闭一个已经关闭的通道会导致panic
无缓冲通道上的发送操作会阻塞,直到另一个goroutine再该通道上执行接收操作,这时值才能发送成功,两个goroutine将继续执行。相反,如果接收操作先执行,接收方的goroutine将阻塞,直到另一个goroutine再该通道上发送一个值。 使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此,无缓冲通道也称为同步通道。
# 单向通道
chan<- 是一个只能发送的通道,可以发送,但是不可以接收 <-chan 是一个只能接收的通道,可以接收,但是不可以发送
在函数传参及任何赋值操作中将双向通道转换为单向通道是可以的,但是反过来是不可以的。
上次更新: 2023/01/11