1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 //channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。 9 //声明通道类型 10 var a chan int //声明一个int类型的通道 ,声明之后需要对它进行初始化 11 fmt.Println(a) 12 ch := make(chan int, 10) //进行初始化 有缓冲的通道 13 ch <- 10 //将10发送到通道中 14 x := <-ch //从通道中将10取出来赋值给x 15 fmt.Println(x) 16 close(ch) //关闭通道 17 //无缓冲通道 18 ch1 := make(chan int) 19 go recv(ch1) 20 ch1 <- 20 21 } 22 23 func recv(c chan int) { 24 ret := <-c 25 fmt.Println(ret) 26 }
for range循环读取通道中的值:
1 package main 2 3 import "fmt" 4 5 func main() { 6 7 a := make(chan int) 8 b := make(chan int) 9 go func() { 10 for i := 0; i < 20; i++ { 11 a <- i 12 } 13 close(a) 14 }() 15 go func() { 16 for{ 17 i,ok:=<-a 18 if !ok{ 19 break 20 } 21 b<-i 22 } 23 close(b) 24 }() 25 26 for i:=range b{ 27 fmt.Println(i) 28 } 29 }
单向通道:
chan<- int
是一个只写单向通道(只能对其写入int类型值),可以对其执行发送操作但是不能执行接收操作;<-chan int
是一个只读单向通道(只能从其读取int类型值),可以对其执行接收操作但是不能执行发送操作。
在函数传参及任何赋值操作中可以将双向通道转换为单向通道,但反过来是不可以的。
select多路复用:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println(x)
case ch <- i:
}
}
}
使用select
语句能提高代码的可读性。
- 可处理一个或多个channel的发送/接收操作。
- 如果多个
case
同时满足,select
会随机选择一个。 - 对于没有
case
的select{}
会一直等待,可用于阻塞main函数。