文章目录
一、什么是通道类型
Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。
如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
二、通道产生的原因
虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态
问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。
Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存
而不是通过共享内存而实现通信。
三、声明channel
语法:
var 变量 chan 元素类型
例:
var ch1 chan int // 声明一个传递整型的通道
var ch2 chan bool // 声明一个传递布尔型的通道
var ch3 chan []int // 声明一个传递int切片的通道
四、创建channel
语法:
make(chan 元素类型, [缓冲大小])
注意: 声明的通道后需要使用make函数初始化之后才能使用。channel的缓冲大小是可选的。
例:
ch4 := make(chan int, 3)
ch5 := make(chan bool)
ch6 := make(chan []int)
五、channel相关操作
1、发送值
将一个值发送到通道中。
例:
ch <- 10 // 把10发送到ch中
2、接收值
从一个通道中接收值。
例:
x := <- ch // 从ch中接收值并赋值给变量x
<-ch // 从ch