chanel通道,在golang的变量为chan,为什么要单独开一章出来讲解呢,主要是chan是一个挺重要的东西,并且在golang并发当中是一个完美的调和剂。
通道的特性
Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。
通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。
package main
import (
"fmt"
"github.com/astaxie/beego/logs"
"sync"
"time"
)
var waitGorup sync.WaitGroup
//发送消息
func P(queue chan<- int){
for i:= 0; i < 1000; i++{
queue <- i
}
time.Sleep(time.Second)
}
//读取消息 通道为只读
func C(queue <-chan int){
for data := range queue {
logs.Info(data)
}
}
func main(){
//声明一个双向通道
ints := make(chan int, 10)
//通道名称chan<-类型 只写
//通道名称<-chan 类型 只读
//声明一个只能写入的通道
//sendInts:=make(chan<-int,10)
////声明一个只能读取的通道
//recever:=make(<-chan int,10)
waitGorup.Add(2)
queue := ints // 这里的10表示管道的容量,根据应用的需求进行设置
//传入一个双向通道会进入函数会转换成一个 单项通道 只写
go P(queue)
//传入一个双向通道会进入函数会转换成一个 单项通道 只读
go C(queue)
//for循环读取通道中的数据
var input string
fmt.Scan(&input)
close(queue)
<-queue
}
网友评论