GO语言之channel的原理及使用 |青训营

202 阅读2分钟

首先简单创建一个goroutine,代码如下图:

image.png 子goroutine和主goroutine是并行关系,但是子goroutine是依赖于main的,所以如果main退出的话,子goroutine也会停止。我们可以使用routmne Goexit()来退出当前的goroutine。 我们不仅可以使用定向函数创建,还可以使用匿名函数。例如:go func [] {}这个是无参数的匿名函数,go func [a int , b int ]bool{}这个是有参数有返回值的。 综上,我们使用go这个关键字就可以创建一个goroutine,但是因为goroutine是并行的,没有办法得到返回值,而channel可以做到goroutine与goroutine之间的通信,下面就简单介绍一下channel。 我们可以使用make来创建一个channel,

image.png 接下来是channel的接收:

image.png 箭头部分是一个小于号和一个减号。下面通过一个简单的代码来深入了解一下channel。

image.png 首先定义了一个channel,在子goroutine中将666发送给c,在主goroutine接收c并赋值给num,但是goroutine是并行的,channel如何保证两个goroutine同步呢。事实上,如果子goroutine已经将666传递给c而主goroutine还没有运行到c的接收时,管道就会发送阻塞给子goroutine直至主goroutine运行到c的接收。同样的,当主goroutine运行到c的接收而子goroutine还未运行到c <- 666时,主goroutine会阻塞直至子goroutine运行到c <- 666。通过管道发送阻塞使两个goroutine同步。

image.png 我们可以将它想象成接棒游戏,只有当两个小人的手同时伸进通道中才成功,如果一个小人的手还没有伸进去,另一个就会停止,就是发送阻塞,直至手伸进去。 以上是无缓冲的channel,下面介绍一下有缓冲的channel。

image.png 当通道中的棒子放满或者取空时才会有阻塞而停止。 通过下面一段代码简单理解一下:

image.png 以上就是channel的所有内容。