当前位置: 首页 > news >正文

Go语言入门(22)-通道 channel

通道(channel)可以在多个goroutine之间安全地传递值,它可以用作变量、函数参数、结构体字段等。

如何使用?:

创建通道用make函数,并指定其传输数据的类型:c := make(chan int)

使用左箭头操作符“<-”向通道发送值 or 从通道接受值。例如

向通道发送值: c <- 2 ;  从通道接收值:r := <- c

发送操作会等待,直到另一个goroutine尝试对该通道进行接收操作为止。下面来看一个简单的例程

package mainimport "fmt"func main() {c :=make(chan int)for i := 0;i < 5; i++{go sleepyGopher(i,c)}for i := 0; i < 5; i++ {gopherID := <- cfmt.Println("gopher",gopherID,"has finished sleeping")}}func sleepyGopher(id int,c chan int) {time.Sleep(3 * time.Second)fmt.Println("...",id," sconre ...")c <- id
}

运行逻辑如上图所示。

使用Select处理多个通道:
目的:等待不同类型的值。

介绍一个函数:time.After,返回值是一个通道,该通道在指定时间后会接收到一个值(发送该值的goroutine是Go运行时的一部分)。Select和switch有点像,该语句包含的每个case都持有一个通道,用来发送or接收数据。select会等待直到某个case分支的操作就绪,然后就会执行该case分支。

下面再看一个例程

package mainimport "fmt"func main() {c :=make(chan int)for i := 0;i < 5; i++{go sleepyGopher(i,c)}timeout := time.After(2 * time.Second)for i := 0; i < 5; i++ {select {case gopherID := <- c:fmt.Println("gopher",gopherID,"has finishied sleeping")case <- timeout:fmt.Println("my patience ran out!")return}}
}func sleepyGopher(id int,c chan int) {time.Sleep(time.Duration(rand.Intn(4000)) * time.Millisecond)c <- id
}

需要注意的是:即使已经停止等待goroutine,但只要main函数还没返回,仍在运行的goroutine将会继续占用内存。

nil通道:

如果不使用make初始化通道,那么通道变量的值就是nil(零值)

对nil通道进行发送or接收不会引起panic,但会导致永久阻塞。对通道执行close函数,会引起panic。

nil通道的用处:对于包含select语句的循环,如果不希望每次循环都等待select所涉及的所有通道,那么可以先将某些通道设为nil,等到发送值准备就绪之后,再将通道变成一个非nil值并执行发送操作。

http://www.dtcms.com/a/457461.html

相关文章:

  • 做期货看那个网站比较专业网站内容方案
  • 网站快速建设软件下载wordpress图片博客插件
  • 52Hz——STM32单片机学习记录——定时器
  • PID--微分项D
  • 如何配置 GitHub 远程仓库及本地 Git 环境
  • 旋转矩阵的推导+矩阵在3DGS中的应用
  • 泰山派无 eMMC 版:嘉立创 Linux 镜像 “大 SD 卡资源浪费” 问题解析与解决
  • 人物摄影网站济宁网站建设优惠
  • WebClient工具调用HTTP接口报错远程主机断开连接
  • 【C语言基础详细版】09. 文件操作完全指南:从基础到高级应用
  • 卡盟网站专用主机批量建wordpress
  • Java高并发常见架构、处理方式、api调优
  • 基于 Delphi 与 ICS 的 Mosquitto Broker 重构实现:架构创新与技术比较分析
  • rag的评估优化应用前景
  • 1.2 openEuler - 安装OpenStack云计算平台基础框架
  • wordpress值得买模板百度智能小程序怎么优化排名
  • 徐州网站建设咨询2022年国际十大新闻
  • 中山精品网站建设机构wordpress目录列表
  • 智能体大模型基础入门(RAG难点图片详细讲解)
  • php网站数据迁移建网站自己做服务器
  • 河源盛世网站建设福州市城乡建设发展总公司网站
  • 嵌入式 Linux 启动优化:从 8 秒到 3 秒的极致加速
  • 网站建设 手机app网站建设书籍 知乎
  • 函数映射在不等式中的作用
  • JavaScript 事件流:事件捕获和事件冒泡
  • 数据湖架构
  • 对网站有效的优化软件长沙网站托管
  • 网站用户 分析宁波网站建设联系电话查询
  • Docker 镜像结构
  • RAG 让你的 AI 更聪明