这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
管道:
如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int。
Go语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。
管道使用:
1. // 声明方式,在此ElemType是指此管道所传递的类型
1. var chanName chan ElemType
1. // 声明一个传递类型为int的管道
1. var ch chan int
1. // 声明一个map,元素是bool型的channel
1. var m map[string] chan bool
1.
1. // 定义语法,定义需要使用内置函数make()即可,下面这行代码是声明+定义一个整型管道
1. ch := make(chan int)
1. // 事先定义好管道的size,下面这行代码定义管道的size为100
1. ch := make(chan int, 100)
1.
1. // 由管道中读写数据,<-操作符是与最左边的chan优先结合的
1. // 向管道中写入一个数据,在此需要注意:向管道中写入数据通常会导致程序阻塞,直到有
1. // 其他goroutine从这个管道中读取数据
1. ch<- value
1. // 读取数据,注意:如果管道中没有数据,那么从管道中读取数据会导致程序阻塞,直到有数据
1. value := <-ch
1.
1. // 单向管道
1. var ch1 chan<- float64 // 只能向里面写入float64的数据,不能读取
1. var ch2 <-chan int // 只能读取int型数据
1.
1. // 关闭channel,直接调用close()即可
1. close(ch)
1. // 判断ch是否关闭,判断ok的值,如果是false,则说明已经关闭(关闭的话读取是不会阻塞的)
1. x, ok := <-ch
管道的特性:
- 可读写,管道可读写任意类型的数据
- 管道的读写是协程安全的
- 管道的操作是阻塞的,如果当前管道已满则无法写入、管道无数据可读均会导致当前协程阻塞
- 管道可传输任意数据类型比如,比如int、string、指针、或自定义数据结构
管道种类:
可读写管道声明make(chan int)
只读管道声明make(<-chan int)
只写管道声明make(chan<- int)