【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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix