go语言使用chan的小技巧

技巧1:关闭某个chan时,所有读取该chan的协程都会收到通知

注意事项:是直接关闭chan就可以了,不需要向这个协程内压入数据,因为压入数据的话最终还得关闭chan

举例:如果协程A希望协程B在处理完某个事情后自己能收到通知,可以向协程B的函数参数中传入一个chan,然后协程A阻塞读取该chan。协程B在需要通知其的时候关闭chan即可,这样协程A就会返回。

常用于:某个协程内新建了一个子协程,但是希望子协程在某个时候,例如初始化完成时通知自己

代码实验:

1. 主协程创建一个子协程,在子协程的函数参数中传入一个无缓冲的chan

2. 主协程阻塞读取这个chan

3. 子协程在2秒后关闭这个chan,可以发现主协程从阻塞中返回

实验结果如下图(可以发现子协程一旦关闭chan,主协程立马就从阻塞中返回了)

完整代码

package main
import ("fmt""time"
)
func func1(c chan bool) {fmt.Println("func1 init start, time=", time.Now().UnixMilli())// 用sleep模拟初始化工作time.Sleep(time.Second)fmt.Println("func1 init end,   time=", time.Now().UnixMilli())close(c)time.Sleep(time.Second)fmt.Println("func1 end, 	  time=", time.Now().UnixMilli())
}func main() {fmt.Println("main start,       time=", time.Now().UnixMilli())c := make(chan bool, 1)go func1(c)// 开始阻塞等待<-cfmt.Println("main continue,    time=", time.Now().UnixMilli())time.Sleep(time.Second * 2)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/54718.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于VScode解析leveldb的namespace报错

发现 VScode 读取 leveldb 的代码&#xff0c;其中 port 命名空间始终解析不了…然后试了很多 include 方法都没有效果 最终去找其头文件port. 发现是需要进行宏定义…

神码ai伪原创工具【php源码】

大家好&#xff0c;小编为大家解答python炫酷烟花表白源代码的问题。很多人还不知道html代码烟花特效python&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 目录 前言 环境准备 代码编写 效果展示 前言 Python实现浪漫的烟花特效 现在…

Django架构图

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身…

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …

Stripe订阅支付和WebHook事件

&#xff08;哪里有天才&#xff0c;我是把别人喝咖啡的功夫都用在工作上的。——鲁迅&#xff09; stripe Stripe是由20多岁的两兄弟Patrick Collison和John Collison创办的Stripe为公司提供网上支付的解决方案。Stripe向服务的公司收取每笔交易的2.9%加上30美分的手续费 订…

[ MySQL ] — 库和表的操作

目录 库的操作 创建数据库 语法&#xff1a; 使用&#xff1a; 字符集和校验规则 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 操纵数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备…

增强型Web安全网关在银行的应用

销售&#xff0c;绝不是降低身份去取悦客户&#xff0c;而是像朋友一样给予合理的建议。你刚好需要&#xff0c;我刚好专业&#xff01;仅此而已&#xff01; 乔.吉拉德 健康的安全体系&#xff0c;还可以更完善 浙江某商业银行股份有限公司是一家成立多年的商业银行&#xf…

iOS——Block two

Block 的实质究竟是什么呢&#xff1f;类型&#xff1f;变量&#xff1f;还是什么黑科技&#xff1f; Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件&#xff0c;并写好 block 的相关代码。打开「终端」&#xff0c;执行 cd XX…

力扣 62. 不同路径

题目来源&#xff1a;https://leetcode.cn/problems/unique-paths/ C题解1&#xff1a;动态规划。声明二维数组。 确定dp数组&#xff08;dp table&#xff09;以及下标的含义。dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) …

Vue 自定义事件绑定与解绑

绑定自定义事件 说到 Vue 自定义事件&#xff0c;那就需要搞清楚一个问题&#xff0c;为啥有这个玩意。 说到自定义事件之前&#xff0c;需要理解 组件基础的概念。理解了基础概念之后&#xff0c;我们就知道 Vue 的父子之间的通信&#xff0c; 一是 父组件通过 Prop 向子组件…

动态规划之树形DP

动态规划之树形DP 树形DP何为树形DP 树形DP例题HDU-1520 Anniversary partyHDU-2196 Computer834. 树中距离之和 树形DP 何为树形DP 树形DP是指在“树”这种数据结构上进行的动态规划&#xff1a;给出一颗树&#xff0c;要求以最少的代价&#xff08;或取得最大收益&#xff…

1、Spark SQL 概述

1、Spark SQL 概述 Spark SQL概念 Spark SQL is Apache Spark’s module for working with structured data. 它是spark中用于处理结构化数据的一个模块 Spark SQL历史 Hive是目前大数据领域&#xff0c;事实上的数据仓库标准。 Shark&#xff1a;shark底层使用spark的基于…