通道相当于一个队列,他的值是从零开始的。当通道的值为零时,可以看做为一个无值的队列,反之,为一个有值的队列,它可以保证并发的安全性,并且是先进先出的。
声明方式
example 1
package main
import "fmt"
func main() {
num := make(chan int, 3) //声明一个容量为3的int类型的通道
num <- 3 //传入值
num <- 2
num <- 1
//遍历通道,取出加入的值
for i:=1;i<=3;i++{
v := <-num
fmt.Printf("The %d value received from channel num: %v\n",
i,v)}
}
结果
The 1 value received from channel num: 3
The 2 value received from channel num: 2
The 3 value received from channel num: 1
Process exiting with code: 0
通道在被声明好容量之后就不会发生变化了。当进入通道满的时候就不会接收新的值,现在这个时候通道是阻塞的状态。当通道里边的值被消耗了。才会有新值加入。
通道分类
通道分为单向通道还有双向通道
- chan <- int //此为只能接收 不能发送的通道
- <-chan int //只能发送不能接收的通道
- chan int //即可以接收也可以发送