这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
进阶知识:
一、channel:
channel是一种数据类型,channel中文翻译有通道,渠道的意思。而我们其实也可以把这个看成一个管道,并发核心单元通过它就可以发送或者接收数据进行通讯。goroutine运行在相同的地址空间里,而goroutine主要依赖的是通信来共享内存,并不是像java里共享内存来通信。而channel就是主要用来解决goroutine的数据共享的问题。
定义channel变量:创建channel变量时,我们需要用到chan关键字,和make函数。示例代码如下:make(chan Type)。其中的Type用来表示channel收发数据的类型。
操作channel变量:对于channel,我们也可以通过操作符 <- 来进行一些操作。比如channel <- value,是将value发送到channel;<-channel,是接收数据并将其舍弃;x := <-channel,是从channel中接受数据,并赋值给x;x, ok := <-channel,也是从channel中接受数据,并赋值给x,但是多了个ok,是用来判断管道是否关闭或是否为空。
channel可分为无缓冲channel和有缓冲channel。
无缓冲channel是指在接收前没有能力保存任何数据值的通道,这种类型的channel要完成发送和接受两个操作,得要先将发送goroutine和接受goroutine给创建准备好。其中任意一个操作无法离开另一个操作单独存在,否则会使得其中一个goroutine处于阻塞状态,只有条件满足了,才能解除阻塞。
有缓冲channel是指一种在被接收前能存储一个或者多个数据值的通道。这种channel并不像上面这种要求要同时完成发送和接收。那么这种channel什么时候会阻塞呢?一是通道中没有要接收的值时,二是通道没有可用缓冲区容纳被发送的值时。
关闭channel:可以通过内置的close函数来关闭channel。示例代码如下:
c := make(chan int)
go func() {
close(c)
}()