Go channel 介绍
Go 语言(Golang)中的 chan 是通道(channel)的缩写,用于在不同的 goroutine 之间进行通信。通道允许你在 goroutine 之间传递数据,从而实现同步和共享内存。下面是关于 Go 语言中通道的详细介绍和一些常见的用法示例。
创建通道
通道的创建使用 make 函数:
ch := make(chan int)
这里创建了一个传递 int 类型数据的通道。你也可以创建传递其他类型数据的通道,比如 string、struct 等。
发送和接收数据
可以使用通道的发送和接收操作符 <- 来发送和接收数据:
// 发送数据到通道
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 介绍的更多相关文章
- go语言之进阶篇 channel介绍
1.channel介绍 和map类似,channel也一个对应make创建的底层数据结构的引用. 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被 ...
- 一份尽可能全面的Go channel介绍
写在前面 针对目前网络上Go channel知识点较为分散(很难有单独的一份资料把所有知识点都囊括进来)的情况,在下斗胆站在巨人的肩膀上,总结了前辈的工作,并加入了自己的理解,形成了这篇文章.本文类似 ...
- channel 介绍
!!!1.Memory Channel 内存通道 事件将被存储在内存中的具有指定大小的队列中. 非常适合那些需要高吞吐量但是失败是会丢失数据的场景下. 属性说明: !type – 类型,必须是“m ...
- golang的Channel
golang的Channel Channel 是 golang 一个非常重要的概念,如果你是刚开始使用 golang 的开发者,你可能还没有真正接触这一概念,本篇我们将分析 golang 的Chann ...
- Port Channel and VPC
1.Port Channel 介绍 Port Channel 简介 绑定多个物理链路(最多8条),到一个单一的逻辑链路,在两个物理设备之间 每个物理端口只能被放入一个port-channel中. 在 ...
- java学习-NIO(三)Channel
通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另 ...
- 由浅入深剖析 go channel
原文:https://www.jianshu.com/p/24ede9e90490 ---------------------------------- 由浅入深剖析 go channel chann ...
- 8.3 Go channel
8.3 Go channel 在Go语言中,关键字go的引入使得Go语言并发编程更加简单而优雅,但是并发编程的复杂性,以及时刻关注并发编程容易出现的问题需要时刻警惕. 并发编程的难度在于协调,然而协调 ...
- netty核心组件之channel、handler、ChannelHandlerContext、pipeline
channel介绍: netty中channel分为NioServerScoketChannel和NioSocketChannel,分别对应java nio中的ServerScoketChannel和 ...
- golang channel原理
channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...
随机推荐
- k8s livenessprobe和readinessprobe详解
一.为什么需要容器探针 如何保持Pod健康 只要将pod调度到某个节点,Kubelet就会运行pod的容器,如果该pod的容器有一个或者所有的都终止运行(容器的主进程崩溃),Kubelet将重启容器, ...
- NAT类型发现
一.前言 之前一篇文章中,提出了一个判断NAT类型的方案.该方案是自己研究设计的,比较粗糙.近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案. 与自己设计的方 ...
- Rougamo、Fody 实现静态Aop
最近在看项目,看到别人使用Rougamo框架,好奇花了点时间仔细研究了,在这里记录一下. 0. 静态编织 Aop 首先,我们先了解什么是Aop? Aop 是指面向切面编程 (Aspect Orient ...
- 《DNK210使用指南 -CanMV版 V1.0》第二章 Kendryte K210简介
第二章 Kendryte K210简介 1)实验平台:正点原子DNK210开发板 2)章节摘自[正点原子]DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail. ...
- Unity中正面视图的相机最大距离定位
问题背景: Unity中在场景中有这样的需求,就是俯视整个场景或者平视整个场景.这种情况下场景中物体长宽比不一定和相机视口长宽比一致,要保证所有的物体都在视口内,并且距离不能太远,,所以处理起来需要点 ...
- Java中代码Bug记录--泛型失效、数组删除、HashMap死循环
最近在工作的过程中,遇到了不少奇怪自己或者同事的Bug,都是一些出乎意料的,不太容易发现的,记录一下来帮助可能也遇到了这些Bug的人 1. 编译时泛型校验失效 Map<String, Strin ...
- AT_abc215F 题解
考虑二分答案. 假设当前二分的答案为 \(k\),那么对于每个点,距离大于等于 \(k\) 的点构成了平面上 \(4\) 个子平面. 那么只需查询子平面中是否存在点即可,类似于窗口的星星,把问题转换成 ...
- Java 自定义注解校验字段唯一性
业务场景 在项目中,某些情景下我们需要验证编码是否重复,账号是否重复,身份证号是否重复等... 那么有没有办法可以解决这类似的重复代码量呢? 我们可以通过自定义注解校验的方式去实现,在实体类上面加上自 ...
- 学习Java的第一周总结
经历了一周关于Java的学习后,我想已经初步了解了Java.在这一周中我跟随黑马程序员的脚步初步学习,现在已经安装了jdk环境(当然它不只是一个运行环境,还附带了许多开发工具)并能够用它输出" ...
- 解决方案 | pyautogui实现等待特定图片(对话框)出现(可设置等待超时时间)
1.问题 为了等待某个[转换完毕]的图片(对话框)出现,如何设置? 2.解决方案代码如下 下面代码实现的是:设置超时时间为10s,当你在完成前序工作以后,代码开始进入等待,一旦你的特定图片出现了,马上 ...