关于go中的select

笔记仓库:gitee.com/xiaoyinhui


代码中的解释纯个人理解,有不对的望指出

package testsimport ("fmt""testing"
)var uCnt int = 0func TestSelece(t *testing.T) {// 对于 select 语句,在进入该语句时,会按源码的顺序对每一个 case 子句进行求值:这个求值只针对发送或接收操作的额外表达式/*根据下面【select01()】的输出结果 可以分析出来【对于 select 语句,在进入该语句时,会按源码的顺序对每一个 case 子句进行求值】的意思可以看到每次遍历都会计算出3次方法 showStr 的结果,直白点讲就是会执行一次这个方法并且 还是按照代码的顺序 123 进行顺序执行的至于选择那个进行执行这就没有办法确定,因为都可以执行,选择那个执行得看底层的选择*/select01()fmt.Println("")fmt.Println("******************************************")fmt.Println("******************************************")fmt.Println("")/*根据下面【select02()】的输出结果 可以分析出来【这个求值只针对发送或接收操作的额外表达式】的意思前面的部分就不解释了,后面的就是 Channel 的接收不会执行,因为这里如果跟上面的方法一样执行了,那就是给取出来了,结果就不会 打印了show1 后还能打印两次接收的c2的值*/select02()
}func showStr1() int {uCnt++fmt.Println("~~~~~~~~~~~~~11111~~~~~~~~~~~~~~", uCnt)return uCnt
}func showStr2() int {uCnt++fmt.Println("~~~~~~~~~~~222222~~~~~~~~~~~~~~~", uCnt)return uCnt
}func showStr3() int {uCnt++fmt.Println("~~~~~~~~~~~333333~~~~~~~~~~~~~~~", uCnt)return uCnt
}func select01() {c1 := make(chan int)go func() {for v := range c1 {if v != 0 {fmt.Println("++++++++", v)}}}()for i := 1; i <= 3; i++ {select {case c1 <- showStr1():fmt.Println("show1 ================", i)case c1 <- showStr2():fmt.Println("show2 ================", i)case c1 <- showStr3():fmt.Println("show3 ================", i)}}close(c1)/*某次输出结果~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 1~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 2~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 3show1 ================ 1~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 4~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 5~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 6++++++++ 1++++++++ 5show2 ================ 2~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 7~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 8~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 9show3 ================ 3++++++++ 9*/
}func select02() {c1 := make(chan int)c2 := make(chan int)go func() {for v := range c1 {if v != 0 {fmt.Println("++++++++", v)}}}()go func() {c2 <- 88c2 <- 99}()for i := 1; i <= 5; i++ {select {case c1 <- showStr1():fmt.Println("show1 ================", i)case c1 <- showStr2():fmt.Println("show2 ================", i)case c1 <- showStr3():fmt.Println("show3 ================", i)case mV := <-c2:fmt.Println("mV := <-c2 ================", i, mV)}}close(c1)/*某次输出结果~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 1~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 2~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 3show1 ================ 1~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 4~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 5~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 6mV := <-c2 ================ 2 88~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 7~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 8~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 9mV := <-c2 ================ 3 99~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 10++++++++ 1~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 11~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 12show1 ================ 4~~~~~~~~~~~~~11111~~~~~~~~~~~~~~ 13~~~~~~~~~~~222222~~~~~~~~~~~~~~~ 14~~~~~~~~~~~333333~~~~~~~~~~~~~~~ 15++++++++ 10++++++++ 14show2 ================ 5*/
}

一点点笔记,以便以后翻阅。

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

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

相关文章

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。下面是 Flink 的架构概述&#xff1a; JobManager&#xff1a;JobManager 是 Flink 集群的主节点&#xff0c;负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

即插即用卷积之TalkingHeadAttn

import torch from torch import nn""" 个代码实现了一个名为"TalkingHeadAttn"的自注意力模块(Self-Attention),主要用于增强神经网络在输入序列上的特征表示和建模。以下是这个自注意力模块的关键部分和特点:多头自注意力:这个模块使用了多头自…

Android13 客制化U盘挂载路径

Android 8.1 OTG U盘无法显示在系统文件管理的修改_mtk 屏蔽当贝市场u盘弹框-CSDN博客 Android 8.1 客制化OTG U盘的挂载路径名称_安卓8.1 u盘挂载目录-CSDN博客

Tomacat下载并且手动自动部署Web项目

Tomacat下载并且手动自动部署Web项目 Tomcat的简介Tomcat的作用Tomcat的下载Tomcat 部署1、环境准备2、手动部署项目3、自动部署项目&#xff08;IDEA&#xff09; ⭐ 前言 ⭐ 本篇文章主要介绍 Tomacat下载部署Web项目的详细使用以及部分理论知识 Tomcat的简介 Tomcat 服务…

硬盘分区怎么恢复数据 硬盘分区如何恢复原来的数据

硬盘分区是我们在使用电脑时经常会遇到的问题&#xff0c;而且很多人都会因为误操作或者其他原因导致硬盘分区数据丢失。这时候&#xff0c;我们就需要知道如何恢复硬盘分区的数据了。 首先&#xff0c;我们需要知道硬盘分区数据丢失的原因。一般来说&#xff0c;硬盘分区数据丢…

setTimeout+Promise+Async输出顺序?

注明&#xff1a;本文不涉及Nodejs执行机制 同步 && 异步 什么是异步&#xff0c;什么是同步&#xff0c;我不多说&#xff0c;我就通过小故事来讲讲吧。 同步&#xff1a;你打电话去书店订书&#xff0c;老板说我查查&#xff0c;你不挂电话在等待&#xff0c;老板把…

基于Node.js 和 FFmpeg构建自动化脚本用来转码视频

这个脚本将监控一个特定的目录&#xff0c;自动转码新添加的视频文件&#xff0c;并将转码后的视频保存到指定目录。 准备环境 安装 Node.js: 访问 Node.js 官网&#xff0c;下载并安装适合你操作系统的 Node.js 版本。 安装 FFmpeg(不清楚的可以看我的上篇博客里有详细的安装…

Memcached 数据库介绍

一 Memcached 介绍 &#xff08;一&#xff09;Memcached 简单介绍 弊端 不能持久化 &#xff08;不支持存在硬盘里&#xff09; Memcached 只支持能序列化的数据类型&#xff0c;不支持持久化&#xff0c;基于Key-Value的内存缓存系统 memcached 虽然没有像redis所具备的…

【Golang星辰图】图像和多媒体处理的创新之路:Go语言的无限潜能

图像处理、音视频编辑&#xff0c;Go语言不再局限&#xff1a;揭秘opencv和goav的威力 前言: 在当今的数字时代&#xff0c;图像处理和多媒体技术在各个领域中的应用越来越广泛。无论是计算机视觉、图像处理还是音视频处理&#xff0c;选择合适的库和工具至关重要。本文将介绍…

宏任务及微任务

js有一个基于事件循环的并发模型&#xff0c;事件循环负责执行代码、收集和处理事件&#xff0c;以及执行队列中的子任务。js是单线程的&#xff08;某一刻只能执行一行代码&#xff09;&#xff0c;为了让耗时带啊不阻塞其他代码运行&#xff0c;设计了事件循环模型。 事件循环…

【Golang星辰图】 编织自动化魔法:使用 Go 语言中的自动化和部署工具构建可靠的基础设施

Go 语言中的自动化和部署&#xff1a;使用 Ansible、Docker、Kubernetes、Terraform、Jenkins、GitLab 和 Vault 的详细指南 前言&#xff1a; 自动化和部署是当今软件开发生命周期中不可或缺的环节。使用自动化工具可以提高效率、降低成本、减少人为错误&#xff0c;并使软件…

学生时期学习资源同步-1 第一学期结业考试题1

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

D-Star 寻路算法

D-Star 寻路算法 下面简写 D-Star 为 D* D算法&#xff1a;D 算法”的名称源自 Dynamic A Star,最初由Anthony Stentz于“Optimal and Efficient Path Planning for Partially-Known Environments”中介绍。它是一种启发式的路径搜索算法&#xff0c; 适合面对周围环境未知或者…

把 Windows 装进 Docker 容器里

本篇文章聊聊如何在 Docker 里运行 Windows 操作系统&#xff0c; Windows in Docker Container&#xff08;WinD&#xff09;。 写在前面 我日常使用 macOS 和 Ubuntu 来学习和工作&#xff0c;但是时不时会有 Windows 使用的场景&#xff0c;不论是运行某个指定的软件&…

业务交付-SIT案例模板

XXXX系统 SIT案例 承建单位&#xff1a;XXXX公司 编制时间&#xff1a;XXXX年XX月 1、引言 ​​​​​​​1.1编写目的 本测试计划目的&#xff0c;为测试XXXX系统功能正常可用&#xff0c;是否符合需求设计&#xff0c;业务逻辑是否符合需求设计具体包括以下方面&#xff1…

QThread常用相关函数、线程启动方式

一、常用相关函数 可以将常用的函数按照功能进行以下分类&#xff1a; 线程启动 void start() 调用后会执行run()函数&#xff0c;但在run()函数执行前会发射信号started()&#xff0c;操作系统将根据优先级参数调度线程。如果线程已经在运行&#xff0c;那么这个函数什么也不…

杂谈-关于如何在博客或者技术站上提问才能获得作者更高的回复意愿和交流热情

如何提问一个有效的问题 &#x1f606; 首先为什么写这篇文章&#xff0c;由于在研究生的学习和工作过程中由于个人技术知识稍微丰富一点点也比较好学&#xff0c;经常会被提问或者自己提问-在博客&#xff0c;GitHub上&#xff0c;Stakflow上等等-也在和学弟学妹交流的过程中听…

Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题

Java面试深度剖析&#xff1a;设计模式、内存优化与并发处理 在Java技术栈中&#xff0c;设计模式、内存优化和并发处理是构建健壮、高效应用程序的关键。本文将通过三道精心设计的面试题&#xff0c;深入探讨这些知识点&#xff0c;旨在帮助读者在面试中展现深厚的技术功底&a…

C#调用Halcon出现尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException

一、现象 在C#中调用Halcon&#xff0c;出现异常提示&#xff1a;尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException 二、原因 多个线程同时访问Halcon中的某个公共变量&#xff0c;导致程序报错 三、测试 3.1 Halcon代码 其中tsp_width…

ELF-DISCOVER:大型语言模型自我构建推理结构

论文地址&#xff1a;https://arxiv.org/pdf/2402.03620.pdf Abstract 我们引入了SELF-DISCOVER&#xff0c;这是一个通用框架&#xff0c;用于让LLMs自我发现任务内在的推理结构&#xff0c;以解决对典型提示方法具有挑战性的复杂推理问题。该框架的核心是一个自我发现过程&…