Go 语言入门指南——Channel | 青训营

110 阅读1分钟

Go语言中的channel是一种用于协程之间通信的机制。在并发编程中,协程之间的通信是非常重要的,因为它可以使得不同的协程之间协同工作,从而实现更高效的程序执行。

一、概念

  1. channel本质是一个数据结构 ---> 队列 先进先出
  2. channel是有类型的,一个string类型的管道只能存放string类型的数据
  3. channel是引用类型

二、channel的用法

  1. 初始化

定义/声明方式: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错误!

  1. 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取数据阻塞问题