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 ...
随机推荐
- FM20S用户手册-Linux开发环境搭建
- FreeRDP使用,快速找出账户密码不正确的服务器地址
最近有个需求,需要找出服务器未统一设置账户密码的服务器,进行统一设置,一共有一百多台服务器,一个个远程登录看,那得都费劲啊,这时候就可以用到FreeRDP这个远程桌面协议工具,FreeRDP下载,根据 ...
- 如何在有数BI中实现千人千面的数据推送?
问题背景 前几天有个项目管理的同学来咨询我一个问题,该项目有一个项目进度信息表,表中有项目名称,项目阶段,项目状态,项目任务等字段,在实际工作中想要实现如下场景: 当项目名称为A时,且项目阶段是需求阶 ...
- docker 容器迁移到其他机器
docker 容器迁移到其他机器思路为:容器转为镜像,再保存为镜像文件,迁移到其他机器后导入为镜像 1.commit:将容器转镜像 # docker commit {container_id} {镜像 ...
- Diffutoon下载介绍:真人视频转动漫工具,轻松获得上千点赞
最近在刷短视频的时候,偶尔能看到一些真人转动漫风的作品,看起来给人一种新鲜感,流量都还不错,简简单单跳个舞,就能获得上千个点赞~ 那么,这种视频是怎么制作的? 本期给大家介绍一款AI转绘工具Diffu ...
- 将txt转化为csv的方法和遇到问题
一.无法修改扩展名步骤如下 二.转换之后所有数据都挤在第一列 win10系统修改文件扩展名只需4部,打开我的电脑->查看->选择->查看->取消勾选(已知隐藏文件的扩展名)-& ...
- Jmeter函数助手-自带函数汇总
Jmeter函数助手自带函数汇总(Jmeter官网-函数助手详解:https://jmeter.apache.org/usermanual/functions.html) BeanShell:用于简单 ...
- 【Big Data】 DBeaver连接Phoenix
前言 Phoenix是Hbase数据库的一个SQL化中间件 Hbase本身是一个NoSQL类型的列族库,Phoenix可以将其转换成SQL操作 Phoenix提供的客户端Jar包,可以让DBeaver ...
- 【C3】01 概述
CSS (层叠样式表) 让你可以创建好看的网页,但是它具体是怎么工作的呢? 这篇文章通过一些很简单的例子,告诉我们什么是 CSS, 同时还会涉及一些和 CSS 相关的专业术语. 预备知识: 基本的计算 ...
- 2024年世界体育界的第一大丑闻:利昂内尔·梅西 (The biggest scandal in the world of sports in 2024: Unethical player - Lionel Messi.)
无德球员,梅西亲日辱华,不顾球迷感受,拒绝在中国的比赛中上场,并以所谓的伤病为借口,却在3天后的日本比赛中完全恢复如初,并进行了30分钟的高强度的对抗比赛并射门,可以说梅西的这一行径就是对中国亿万百姓 ...