channel:goroutine间通信

简介: 【10月更文挑战第15天】

在Go语言中,channel 是用于 goroutine 之间通信的基本构造。它不仅提供了goroutine之间数据传递的途径,而且还内建了同步机制,确保了数据的一致性和并发安全性。

创建Channel

创建一个channel非常简单,只需要使用 make 函数,并指定channel中将要传递的数据类型。如果需要创建一个带有缓冲区的channel,还需要指定缓冲区的大小。

ch := make(chan int)          // 创建一个可以传递int类型数据的无缓冲channel
chBuf := make(chan int, 10)  // 创建一个可以存储10个int类型数据的有缓冲channel

使用Channel

发送数据

使用 ch <- value 的形式可以向channel发送数据,这里的 value 必须与channel声明时指定的数据类型相匹配。

接收数据

使用 value := <-ch 的形式可以从channel接收数据,这里 value 的类型应该与channel的数据类型一致。

非阻塞接收

可以使用非阻塞的方式来尝试接收数据,这种方式会返回两个值:接收的数据和一个布尔值表示是否有数据接收。

value, ok := <-ch
if !ok {
   
    // channel已关闭,或在尝试接收时channel为空且无数据发送
}

关闭Channel

当不再需要向channel发送数据时,可以使用 close 函数来关闭channel。

close(ch)

关闭channel后,任何试图从该channel接收数据的操作都会立即返回,并且如果channel中有剩余的数据,则会继续返回这些数据,直到所有数据都被接收完毕。之后,所有的接收操作都会返回该类型对应的零值以及 false 表示channel已关闭。

Channel与Select

select 语句可以用来同时监听多个channel的操作,这对于处理超时或者实现其他复杂的通信逻辑非常有用。

select {
   
case data := <-ch1:
    fmt.Println("Received from ch1:", data)
case ch2 <- data:
    fmt.Println("Sent to ch2")
default:
    fmt.Println("No communication")
}

流水线模式

Go语言中的channel经常被用来构建流水线模式的程序。在这种模式下,一系列的goroutine通过channel相互连接,每个goroutine负责处理一部分工作,然后将结果传递给下一个goroutine。

示例

下面是一个简单的示例,展示如何使用channel在两个goroutine之间传递数据。

package main

import (
    "fmt"
    "sync"
)

func main() {
   
    var wg sync.WaitGroup
    ch := make(chan string)

    // 创建一个goroutine来发送数据
    wg.Add(1)
    go func() {
   
        defer wg.Done()
        ch <- "Hello, World!"
    }()

    // 创建一个goroutine来接收数据
    wg.Add(1)
    go func() {
   
        defer wg.Done()
        fmt.Println(<-ch)
    }()

    // 等待所有的goroutine完成
    wg.Wait()
}

在这个例子中,我们创建了两个goroutine:一个用来发送消息,另一个用来接收消息。sync.WaitGroup 用来确保main函数在所有goroutine完成后才退出。

目录
相关文章
|
12月前
|
存储 机器学习/深度学习 大数据
量子计算与大数据:处理海量信息的新方法
【10月更文挑战第31天】量子计算凭借其独特的量子比特和量子门技术,为大数据处理带来了革命性的变革。相比传统计算机,量子计算在计算效率、存储容量及并行处理能力上具有显著优势,能有效应对信息爆炸带来的挑战。本文探讨了量子计算如何通过量子叠加和纠缠等原理,加速数据处理过程,提升计算效率,特别是在金融、医疗和物流等领域中的具体应用案例,同时也指出了量子计算目前面临的挑战及其未来的发展方向。
|
自然语言处理 网络安全 Python
【Python】已解决:nltk.download(‘punkt’) [nltk_data] Error loading punkt: [WinError 10060] [nltk_data]
【Python】已解决:nltk.download(‘punkt’) [nltk_data] Error loading punkt: [WinError 10060] [nltk_data]
3566 1
|
10月前
|
前端开发 Java 测试技术
基于Qwen2.5-Coder 快速搭建应用管理系统
本文介绍了如何利用Qwen2.5-Coder快速搭建一个应用管理系统。通过访问ModelScope通义千问Qwen模型库,选择Qwen2.5-Coder模型,生成Spring Boot项目代码包,并逐步解决项目运行中遇到的问题,如Java版本不兼容等。文章还展示了如何优化用户管理页面的功能和样式,最终实现了从零代码到完整应用的搭建过程,提供了良好的用户体验和开发效率。附带的可运行代码链接为:[https://gitee.com/null_096_1927/demo](https://gitee.com/null_096_1927/demo)。
基于Qwen2.5-Coder 快速搭建应用管理系统
|
11月前
|
人工智能 JSON 自然语言处理
基于文档智能&RAG搭建更懂业务的AI大模型
本文介绍了一种结合文档智能和检索增强生成(RAG)技术,构建强大LLM知识库的方法。通过清洗文档内容、向量化处理和特定Prompt,提供足够的上下文信息,实现对企业级文档的智能问答。文档智能(Document Mind)能够高效解析多种文档格式,确保语义的连贯性和准确性。整个部署过程简单快捷,适合处理复杂的企业文档,提升信息提取和利用效率。
|
12月前
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版实践解决方案评测
随着企业业务的增长,对消息队列的需求日益提升。阿里云的云消息队列 RabbitMQ 版通过架构优化,解决了消息积压、内存泄漏等问题,并支持弹性伸缩和按量计费,大幅降低资源和运维成本。本文从使用者角度详细评测这一解决方案,涵盖实践原理、部署体验、实际优势及应用场景。
|
12月前
|
人工智能 自然语言处理 Java
我和我的通义灵码
本文介绍了阿里云的AI代码助手——通义灵码,从个人版和企业版两个方面详细阐述了其功能和使用方法。作者作为一名Java开发工程师,分享了自己使用通义灵码的经验,包括代码生成、智能问答等功能,以及如何通过@workspace、@terminal和#team docs等命令提高开发效率。文章还提到了企业版的特色功能,如企业知识库的配置和代码优化,展示了通义灵码如何帮助企业提高代码质量和开发效率。
|
人工智能 数据可视化 数据处理
推荐2款免费开源的标注工具,支持大模型对话标注
【LabelLLM】一款开源免费的大模型对话标注平台,专为优化大型语言模型的数据标注过程设计。支持灵活配置与多模态数据(音频、图像、视频),具备全面任务管理和AI辅助标注功能,大幅提升标注效率与准确性。了解更多请前往https://github.com/opendatalab/LabelLLM 【LabelU】一款轻量级开源标注工具,支持图像、视频、音频的高效标注。特色功能包括多功能图像处理、视频和音频分析等,简易灵活,支持多种数据格式输出。了解更多请前往https://github.com/opendatalab/labelU
2961 11
|
弹性计算 运维 负载均衡
基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
【8月更文挑战第3天】基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
安全 Java 编译器
springboot @resource与private final声明式的有何区别??
【6月更文挑战第3天】在Spring Boot中,@Resource 和 private final 常用于依赖注入,但它们的用途和行为有一些重要的区别。
457 1