Go语言之通道

 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会随机选择一个。
  • 对于没有caseselect{}会一直等待,可用于阻塞main函数。
原文地址:https://www.cnblogs.com/yh2924/p/12450693.html