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. post基础错误注入

    Burpsuite抓取HTTP请求 Burpsuite是一款Web安全测试的利器,集成了几乎Web安全测试中所有需要用到的功能. 运行前提: 需要安装Java https://www.java.com ...

  2. Redis挂了,怎么补救?谈谈如何实现redis的高可用

    Redis挂了,怎么补救?谈谈如何实现redis的高可用! Redis实现高可用主要有三种部署模式:主从模式.哨兵模式和集群模式. 分区 分区(Partitioning)是一种最为简单的拓展方式. 在 ...

  3. Python通过GPIO从DHT11温度传感器获取数据

    Python通过GPIO从DHT11温度传感器获取数据 设备:树莓派4B.DHT11.杜邦线 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器. 其精度湿度±5%RH, 温度±2℃,量程 ...

  4. yb课堂之用户下单模块开发 《十四》

    开发用户下单购买视频接口 VideoOrder模块下单接口开发 VideoOrderController.java package net.ybclass.online_ybclass.control ...

  5. 万维网WWW

    万维网是一个大规模的联机式信息储存场所,能方便地从一个网络站点访问另一个网络站点.万维网是一个分布式的超媒体系统. 统一资源定位符URL URL表示从互联网上得到的资源位置和访问这些资源的方法,实际上 ...

  6. QT 的 ModelView

    QApplication a(argc, argv); QDirModel model;    //QDirModel,   问文件目录树 QTreeView tree;    QListView l ...

  7. pytorch问题记录

    1.找不到fused 2.找不到torch_extensions 网上的教程一般都是linux系统的,Windows这个是在C盘目录下 3.c++开发环境中找不到vcvars64.bat 解决方法:重 ...

  8. 移植自淘宝店家的,硬件SPI通讯3.5寸TFT,LCD屏幕。MSPM0G3507

    适用MSPM0G3507 LP开发板 3.5寸TFTLCD屏,SPI通讯 项目是CCStheia的 特点:硬件SPI,速度更快,可以在syscfg中自行修改引脚 蓝奏云: https://wwo.la ...

  9. 买卖股票相关算法-动态规划-python

    要求1: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...

  10. yum密钥报错

    解决报错 [root@node3 mnt]# cat /etc/yum.repos.d/local.repo [BaseOS_repo] baseurl = file:///mnt/BaseOS en ...