1、定义
管道是golang语言提供的goroutine间的通讯方式,channel可以让一个goroutine发送特定的值给另一个goroutine的通讯机制。
管道是引用类型。
golang语言中channel是一种特殊的类型。像一个队列一样,先进先出。
var 变量 chan 元素类型
var ch1 chan int //声明一个传递整型的管道
var ch2 chan []int
2、创建管道
ch := make(chan 类型 容量)
//给管道里面存储数据
ch <- 10
// 获取管道里面的内容
a:=<-ch
<=-ch //从管道取值,不赋给变量
3、管道阻塞
1、管道存储的数据超过容量。
2、在没有使用协程的情况下,如果管道的数据全部取出,再取就会报deadlock
4、循环遍历管道数据
使用for range遍历管道,需要关闭管道 close(ch1)
for 循环 可以不用关闭
Go
package main
import "fmt"
func main() {
var ch1 = make(chan int, 10)
for i := 0; i < 10; i++ {
ch1 <- i
}
close(ch1) //关闭管道
for value := range ch1 { //管道没有key
fmt.Println(value)
}
}
5、管道和goroutine结合使用
Go
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func writeData(ch chan int) {
for i := 0; i < 10; i++ {
ch <- i
fmt.Printf("写入数据%v成功\n", i)
time.Sleep(time.Millisecond * 50)
}
close(ch)
wg.Done()
}
func readData(ch chan int) {
for v := range ch {
fmt.Printf("读取数据%v成功\n", v)
time.Sleep(time.Millisecond * 50)
}
wg.Done()
}
func main() {
var ch1 = make(chan int, 10)
wg.Add(1)
go writeData(ch1)
wg.Add(1)
go readData(ch1)
wg.Wait()
}
6、单向管道
//管道声明为只写
ch2 := make(chan<- int,2)
//管道声明为只读
ch3 :=make(<-chan int,2)
7、多路复用 select
select 的使用类似于 switch 语句,它有一系列 case 分支和一个默认的分支。每个 case 会对
应一个管道的通信(接收或发送)过程。select 会一直等待,直到某个 case 的通信操作完成
时,就会执行 case 分支对应的语句。
使用select来获取channel里面的数据不需要关闭channel
select{
case <-ch1:
...
case data := <-ch2:
...
case ch3<-data:
...
default:
默认操作
}