Go 语言进阶| 青训营笔记

54 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

管道:

如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int。

Go语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。

bbfe7eb1bda349508685bbd14bf98f03.png

管道使用:

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

管道的特性:

  1. 可读写,管道可读写任意类型的数据
  2. 管道的读写是协程安全的
  3. 管道的操作是阻塞的,如果当前管道已满则无法写入、管道无数据可读均会导致当前协程阻塞
  4. 管道可传输任意数据类型比如,比如int、string、指针、或自定义数据结构

管道种类:

可读写管道声明make(chan int)

只读管道声明make(<-chan int)

只写管道声明make(chan<- int)