Go 语言(Golang)中的 chan 是通道(channel)的缩写,用于在不同的 goroutine 之间进行通信。通道允许你在 goroutine 之间传递数据,从而实现同步和共享内存。下面是关于 Go 语言中通道的详细介绍和一些常见的用法示例。

创建通道

通道的创建使用 make 函数:

ch := make(chan int)

这里创建了一个传递 int 类型数据的通道。你也可以创建传递其他类型数据的通道,比如 stringstruct 等。

发送和接收数据

可以使用通道的发送和接收操作符 <- 来发送和接收数据:

// 发送数据到通道
ch <- 42 // 从通道接收数据
value := <-ch

使用 goroutine 和通道示例

package main

import (
"fmt"
"time"
) func main() {
ch := make(chan int) // 启动一个新的 goroutine
go func() {
time.Sleep(2 * time.Second) // 模拟一些工作
ch <- 42 // 发送数据到通道
}() fmt.Println("等待数据...")
value := <-ch // 阻塞,直到接收到数据
fmt.Printf("收到数据:%d\n", value)
}

带缓冲通道

通道可以是带缓冲的,使用带缓冲的通道可以在发送操作和接收操作之间有一定的缓冲区,从而避免在发送时阻塞:

ch := make(chan int, 2)

// 发送数据到带缓冲通道
ch <- 1
ch <- 2 // 接收数据
value1 := <-ch
value2 := <-ch

关闭通道

当你确定不会再向通道发送数据时,可以关闭通道。注意,关闭通道后再发送数据会引发 panic:

ch := make(chan int)

// 启动一个 goroutine 接收数据
go func() {
for value := range ch {
fmt.Println(value)
}
}() // 发送数据
ch <- 1
ch <- 2
ch <- 3 // 关闭通道
close(ch)

select 语句

select 语句用于在多个通道操作中进行选择,类似于 switch 语句,但每个 case 都是一个通道操作:

ch1 := make(chan int)
ch2 := make(chan int) go func() {
time.Sleep(1 * time.Second)
ch1 <- 1
}() go func() {
time.Sleep(2 * time.Second)
ch2 <- 2
}() for i := 0; i < 2; i++ {
select {
case value1 := <-ch1:
fmt.Printf("收到 ch1 的数据:%d\n", value1)
case value2 := <-ch2:
fmt.Printf("收到 ch2 的数据:%d\n", value2)
}
}

总结

通道是 Go 语言中用于 goroutine 之间通信的重要机制。通过使用通道,你可以在不同的 goroutine 之间传递数据,实现同步和共享内存。熟练掌握通道的使用方式,可以帮助你编写高效并发的 Go 程序。

Go channel 介绍的更多相关文章

  1. go语言之进阶篇 channel介绍

    1.channel介绍 和map类似,channel也一个对应make创建的底层数据结构的引用. 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被 ...

  2. 一份尽可能全面的Go channel介绍

    写在前面 针对目前网络上Go channel知识点较为分散(很难有单独的一份资料把所有知识点都囊括进来)的情况,在下斗胆站在巨人的肩膀上,总结了前辈的工作,并加入了自己的理解,形成了这篇文章.本文类似 ...

  3. channel 介绍

    !!!1.Memory Channel 内存通道 事件将被存储在内存中的具有指定大小的队列中. 非常适合那些需要高吞吐量但是失败是会丢失数据的场景下.   属性说明: !type – 类型,必须是“m ...

  4. golang的Channel

    golang的Channel Channel 是 golang 一个非常重要的概念,如果你是刚开始使用 golang 的开发者,你可能还没有真正接触这一概念,本篇我们将分析 golang 的Chann ...

  5. Port Channel and VPC

    1.Port Channel 介绍 Port Channel  简介 绑定多个物理链路(最多8条),到一个单一的逻辑链路,在两个物理设备之间 每个物理端口只能被放入一个port-channel中. 在 ...

  6. java学习-NIO(三)Channel

    通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另 ...

  7. 由浅入深剖析 go channel

    原文:https://www.jianshu.com/p/24ede9e90490 ---------------------------------- 由浅入深剖析 go channel chann ...

  8. 8.3 Go channel

    8.3 Go channel 在Go语言中,关键字go的引入使得Go语言并发编程更加简单而优雅,但是并发编程的复杂性,以及时刻关注并发编程容易出现的问题需要时刻警惕. 并发编程的难度在于协调,然而协调 ...

  9. netty核心组件之channel、handler、ChannelHandlerContext、pipeline

    channel介绍: netty中channel分为NioServerScoketChannel和NioSocketChannel,分别对应java nio中的ServerScoketChannel和 ...

  10. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

随机推荐

  1. C# 温故知新 第三篇 C# 编程概念 之程序集

    在微软C# 官方开发指南中,介绍到在C# 开发中设计到这些 编程概念 当然包括不限于这些: 程序集:程序集构成了 .NET 应用程序的部署.版本控制.重用.激活范围和安全权限的基本单元. 程序集是为协 ...

  2. 一文为你深度解析LLaMA2模型架构

    本文分享自华为云社区<[云驻共创]昇思MindSpore技术公开课 大咖深度解析LLaMA2 模型架构>,作者: Freedom123. 一.前言 随着人工智能技术的不断发展,自然语言处理 ...

  3. 单qubit量子门

    量子编程的基本单元就是量子门.量子编程有点像传统的电路设计,一个量子程序可以被写成量子门序列. 图中有一些符合,比如H门.X门.Z门.测量等,我们都会接触到. 传统计算机程序的输入和输出可以不一样,但 ...

  4. 阿里云服务器Docket安装RabbitMQ 3.8.12

    DocketMQ安装RabbitMQ 地址:https://hub.docker.com/ 拉取镜像 docker pull rabbitmq:3.8.12-management-alpine 运行 ...

  5. Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践

    分享嘉宾:孙方彬 中国移动云能力中心 软件开发工程师 编辑整理:Hoh Xil 出品平台:DataFunTalk 导读:在云原生 + 大数据的时代,随着业务数据量的爆炸式增长以及对高时效性的要求,云原 ...

  6. leetcode简单(矩阵):[566, 766, 832, 867, 999, 1030, 1261, 1275, 1337, 1351]

    目录 566. 重塑矩阵 766. 托普利茨矩阵 832. 翻转图像 867. 转置矩阵 999. 可以被一步捕获的棋子数 1030. 距离顺序排列矩阵单元格 1260. 二维网格迁移 1275. 找 ...

  7. 在Python中doc转docx,xls转xlsx,ppt转pptx(Windows)

    在Python中doc转docx,xls转xlsx,ppt转pptx(Windows) 说明: 首次发表日期:2024-07-18 参考pypi包: doc2docx 缘起 我们一般使用Python开 ...

  8. C# WinForm遍历窗体控件的3种方法

    1.循环遍历 private void GetControls(Control fatherControl) { Control.ControlCollection sonControls = fat ...

  9. 5/15课下作业:评价一下steam软件

    用户界面: 登录后会弹出特惠广告,广告内容可能不常用.主界面简洁方便,启动游戏,购买游戏,浏览社区,浏览自己内容一目了然 记住用户选择: 登录一次后会记住用户的账户密码,可以直接进行用户间的切换,会记 ...

  10. 【Java】Generic 泛型

    Generic 泛型 为什么需要泛型? 集合容器再设计阶段/声明阶段不能确定这个容器实际存储的是什么类型的对象 JDK5 以前只能把元素设计为Object基类 在JDK5之后用泛型来约束对象类型 除了 ...