二、Golang Channel通信和控制题目

news/2025/2/12 11:04:27/

要求

采用Golang语言中channel实现协程间的通讯,并通过控制channel控制起输入与输出格式。其中一个协程sender负责发送字符串"ABC"的字符,另一个协程reciever负责接收这些字符并打印。
要求接收方reciever协程能够按照顺序,按照行输出对接收的值打印出"ABC"(或"AB",跳过"C"),重复10次。

实现代码

以下下代码实现了sender goroutine和revicever goroutine(主协程g0)通过通讯控制,按照字符串顺序接收并打印出AB"(跳过"C"),实现重复10次。
另外,对于跳过的"C"字符的轮齿,打印" No.X"(X为循环输出行的对应次数,输出行内容对应ABC或者AB)。
计时并打印程序运行的总时间。

package mainimport ("fmt""time"
)func main() {content := "ABC"sig := make(chan bool)ch := make(chan rune, 3)go func() {for i := 0; i < 10; i++ {for _, c := range content {ch <- c}sig <- true}close(ch)}()i, j := 1, 1now := time.Now()/*output: ABCfor v := range ch {if i%3 == 0 {<-sigfmt.Printf("%s No.%d\n", string(v), j)j++} else {fmt.Printf("%s", string(v))}i++}*/// output: ABfor v := range ch {if i%3 > 0 {fmt.Printf("%s", string(v))} else {fmt.Printf(" No.%d\n", j)<-sigj++}i++}close(sig)d := time.Since(now)fmt.Printf("Running time: %v\n", d)
}

题解分析

以上代码涉及了 Go 语言中的协程(goroutine)、通道(channel)和时间测量。我们将逐段分析代码的执行逻辑,特别是协程操作控制部分。

代码结构

1. List item

  • 初始化变量和通道: content 字符串包含 “ABC”。

  • sig 是一个布尔类型的通道,用于信号通知。

  • ch是一个有缓冲区的通道,可以存储 3 个 rune 类型的值。

2. 启动协程

  • 协程中,循环 10 次,每次将 content 中的字符发送到 ch 通道,并在每次循环结束时向 sig 发送一个 true 信号。
  • 循环结束后,关闭 ch 通道。

3.主函数中的 for 循环

  • 使用 for v := range ch 接收 ch 通道中的值。

  • 根据条件打印字符或处理信号,通过sig通道控制输入协程

协程操作控制逻辑

关键逻辑在于 for v := range ch 循环中的条件判断:

for v := range ch {if i%3 > 0 {fmt.Printf("%s", string(v))} else {fmt.Printf(" No.%d\n", j)<-sigj++}i++
}

变量 i 和 j:

  • i 用于计数,从 1 开始递增。

  • j 用于生成信号后的编号,从 1 开始递增。

条件判断:

  • 如果 i%3 > 0,即 i 不是 3 的倍数时,直接打印字符 v。

  • 如果 i 是 3 的倍数时,执行以下操作:

    • 打印 " No.%d\n",其中 %d 被 j 的值替换。
    • 从 sig 通道接收信号(阻塞操作,直到 sig 有信号发送)。
    • j 自增。

通道关闭:

  • 协程在发送完 10 轮字符后关闭 ch 通道,此时 for v := range ch 循环结束。

输出分析

根据代码逻辑,输出会如下进行:

  • 第一轮:打印 “A”, “B”(因为 i 为 1 和 2,都不是 3 的倍数)。

  • 第二轮(i 为 3):打印 " No.1"(因为 i 是 3 的倍数),然后等待 sig 信号(此时协程发送完第一轮信号)。

  • 后续字符继续按此逻辑打印,但注意 sig信号是在每一轮结束后发送的,所以每次 i 为 3 的倍数时,会先打印编号再等待信号。

但是,由于主循环在 i 为 3 的倍数时等待 sig信号,而 sig 信号在每一轮字符发送完后才发送,因此:

  • 在打印完 “AB” 后,i 变为 3,此时会等待第一个 sig 信号(即第一轮结束后发送的信号)。

  • 在接收到信号后,打印 " No.1"并继续。

然而,由于代码中的 for 循环逻辑和信号发送的频率,主循环会在每次 i 为 3 的倍数时等待信号,且 sig信号每轮只发送一次,因此输出将受限于信号发送和接收的同步。

最终结果

实际运行代码时,由于信号同步和通道缓冲区的限制,输出将会是按顺序的 “AB” 后接一个编号,但由于信号在每轮结束后才发送,且主循环在 i 为 3 的倍数时等待信号,实际输出将受限于信号发送的时机和通道缓冲区大小。理论上,如果缓冲区足够且信号同步,输出可能是:

AB No.1
...
AB NO.10

但考虑到信号和缓冲区同步的细节,实际运行可能更复杂,且由于代码逻辑,No.2 及之后的编号可能无法按预期打印,因为主循环在接收到信号后会继续,而信号发送频率与字符发送频率不匹配。

注意

  • 代码中的 close(sig) 是多余的,因为 sig 通道在协程结束时并不会被主循环关闭,且主循环结束后程序也会终止,无需显式关闭 sig。
  • 代码中的时间测量部分用于记录程序运行时间,对逻辑分析无直接影响。

http://www.ppmy.cn/news/1571402.html

相关文章

解决 idea 无法创建java8 模版

解决 idea 无法创建java8 模版 由于 Spring 官方不再维护 旧的版本了导致的 https://start.spring.io 解决方式很简单 切换到 阿里源就可以了 https://start.aliyun.com/ 项目生成 成功 总结 &#xff1a;IDEA 内置的 Spring Initializr 创建 Spring Boot 项目实际上是依赖官…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介&#xff1a; 学习资料&#xff1a; 跳转目录&#xff1a; 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…

从零构建高可用MySQL集群:Percona XtraDB Cluster 实战部署

实战指南&#xff1a;基于Percona XtraDB Cluster 构建高可用 MySQL 集群架构 引言&#xff1a;为什么选择PXC&#xff1f; Percona XtraDB Cluster&#xff08;PXC&#xff09;是基于Galera协议的MySQL高可用解决方案&#xff0c;提供同步多主复制、数据强一致性等关键特性&…

【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器

用Deepseek搭建免费的个人知识库–综合教程&#xff08;完整版&#xff09;&#xff1a;第二篇&#xff1a;Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了&#xff0c;我们的重点不在于那些简单的步骤&#xff0c;而是在需要为下一步做准备的地方更加…

iOS AES/CBC/CTR加解密以及AES-CMAC

感觉iOS自带的CryptoKit不好用&#xff0c;有个第三方库CryptoSwift还不错&#xff0c;好巧不巧&#xff0c;清理过Xcode缓存后死活下载不下来&#xff0c;当然也可以自己编译个Framework&#xff0c;但是偏偏不想用第三方库了&#xff0c;于是研究了一下&#xff0c;自带的Com…

Agent论文阅读:NormEnforcement with a Soft Touch: Faster Emergence, Happier Agents

摘要&#xff08;ABSTRACT&#xff09; 在多智能体系统&#xff08;multiagent system, MAS&#xff09;中&#xff0c;智能体之间的交互可通过社会规范&#xff08;social norms&#xff09;进行调节。通常&#xff0c;社会规范并非预设的规则&#xff08;hardcoded rules&am…

数据结构与算法之数组: LeetCode 541. 反转字符串 II (Ts版)

反转字符串 II https://leetcode.cn/problems/reverse-string-ii/description/ 描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余…

元宇宙中的隐私与数据保护:Facebook 的挑战与机遇

随着数字技术的飞速发展&#xff0c;元宇宙&#xff08;Metaverse&#xff09;正逐渐成为未来互联网的新舞台。Meta&#xff0c;作为这一领域的先行者&#xff0c;正面临着隐私与数据保护的双重挑战。本文将探讨 Meta 在元宇宙中的隐私与数据保护问题&#xff0c;并分析其可能的…