【go】golang中的通道
通道:channel
名词:在 goroutine 中通信的管道
注意:任何时候,同一时刻只能有一个 goroutine 访问通道进行发送和获取数据
通道的顺序:遵循先入先出的规则
通道的定义
// 定义一个通道
var 变量名 chan 数据类型
// 比如:
var intCh chan int64
var strCh chan string
var mapCh chan map[string]any
注意:通道必须使用 make 函数进行初始化,只定义不能使用,报错空指针
// 初始化通道
intch := make(chan int64)
strch := make(chan string)
prtch := make(chan *int64)
通过通道发送数据
// 发送数据
通道名 <- 数据
// 比如:
intCh <- 10 // 把10发送到通道intCh中
strCh <- "alisleepy" // 把字符串alisleepy发送到通道strCh中
通过通道接收数据
// 接收数据
var intCh chan int
intCh <- 10 // 给发送数据到intCh中
// 定义另一个通道,接收数据
recIntCh := make(chan int)
recData := <- recIntCh // 表示把recIntCh通道的数据取出来赋值给data
通道的 4 种接收方式
-
阻塞接收数据
// 执行该语句时发生阻塞,一直直到接收到数据并赋值给data data := <-intCh
-
非阻塞接收数据
data, ok := <-intCh // data : 表示接收到的数据 // ok:表示是否成功接收到数据,如果ok为否,则表示未接收到数据,data的值为通道的零值
注意:非阻塞式的接收方式实际使用很少,会造成高 CPU 使用
-
只接受收据,忽略接收的值
// 该语句会发生阻塞,直到接收到数据 <- intCh // 只接收数据,不把接收的值赋给其他变量
-
循环接收通道内的数据
// 使用for range循环接收 for data := range intCh { // todo:接收数据后的一些处理事项 }
单向通道
- 单向通道声明方式
// 只能发送数据的通道
var 变量名 chan<- 数据类型
比如:var intCh chan<- int // intCh只能发送数据,箭头是数据流向,指向chan,表示数据只能发送到chan
// 只能接收收据的通道
var 变量名 <-chan 数据类型
比如:var strCh <-chan string
带缓冲的通道
1.创建带缓冲的通道
// 增加一个参数,缓冲区大小
var intCh := make(chan int, 10) // 缓冲区大小为10
通道的多路复用-同时接收和发送多个通道的数据
- 描述:就是一条通道上,可以同时接收和发送,比如:电话线
- 关键字:
- select:可以在程序中同时处理多个通道的操作,包括:发送数据、接收数据
- case:case 中的操作必然是一个通道的收发过程
select{
case 操作1:
响应操作1
case 操作2:
响应操作2
default:
没有操作的处理
}
本文来自博客园,作者:alisleepy,转载请注明原文链接:https://www.cnblogs.com/alisleepy/p/18122925