Go语言中的channel是一种用于协程之间通信的机制。在并发编程中,协程之间的通信是非常重要的,因为它可以使得不同的协程之间协同工作,从而实现更高效的程序执行。
一、概念
- channel本质是一个数据结构 ---> 队列 先进先出
- channel是有类型的,一个string类型的管道只能存放string类型的数据
- channel是引用类型
二、channel的用法
- 初始化
定义/声明方式:var 变量名 chan 数据类型
var intChan chan int
var ch chan int
var mapChan chan map[int]string
...
注意:channel必须初始化,比如make之后才能使用
var intChan chan int = make(chan int, 10)
2. 存放数据
ch <- x
ch <- "hello"
...
3. 取出数据
x := <- ch
...
注意:
(1)只能存放指定数据类型的数据; (2)channel数据放满之后不能再存放数据了,阻塞; (3)channel为空时,不能再取出数据,阻塞。
如果希望channel可以接收多种类型的数据,可以将类型定义为空接口类型!
var allChan chan interface{}
4. channel的关闭
close(ch)
注意,如果一个channel已经被关闭,再向它发送数据会导致panic错误!
- channel的遍历
遍历管道不能使用普通的 for 循环,而要采用for-range语句
for v := range intChan2 {
fmt.Println("v=", v)
}
6. channel的使用细节和注意事项
(1)channel可声明为只读或者只写性质
chan1 := make(chan int, 3) // 可读可写
chan2 := make(chan<- int, 3) // 只写
chan3 := make(<-chan int, 3) // 只读
注意:可读可写的管道在函数传参过程中可传给可读管道,也可以传给可写管道!
(2)可以使用select解决channel取数据阻塞问题