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. 详解Web应用安全系列(8)不足的日志记录和监控

    在Web安全领域,不足的日志记录和监控是一个重要的安全隐患,它可能导致攻击者能够更隐蔽地进行攻击,同时增加了攻击被检测和响应的难度.以下是对Web攻击中不足的日志记录和监控漏洞的详细介绍. 一.日志记 ...

  2. P9196 题解

    来一份线性时间的题解. 考虑先解决前缀限制,显然可以直接把字符串和询问全部搬到 Trie 树上,问题就变成了查询一个子树内满足后缀限制的字符串数量. 接着考虑 Trie 树合并,具体地,把后缀限制以及 ...

  3. 深耕分析型数据库领域,火山引擎ByteHouse入围《2024爱分析数据库厂商全景报告》

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 近日,爱分析发布<2024爱分析·数据库厂商全景报告>,报告中爱分析将数据市场从上至下划分为数据库服 ...

  4. MySql 数据库、数据表操作

    数据库操作 创建数据库 语法 语法一:create database 数据库名 语法二:create database 数据库名 character set 字符集; 查看数据库 语法 查看数据库服务 ...

  5. msgpack的使用

    1.引入包 <!--msgpack依赖--> <dependency> <groupId>org.msgpack</groupId> <artif ...

  6. LabVIEW之项目文件结构透析

    代码的管理非常重要,LabVIEW本身自带很多代码管理工具.下面来剖析一个相对标准的小项目:

  7. 让摄像头带上智慧“智驭视界·AIEye”

    接上一篇<物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用"智慧眼AIEye">,经过AI的包装很高级,确实很屌炸天. 智驭视界·AIEye 在科技赋能的 ...

  8. [oeasy]python0136_接收输入_input函数_字符串_str

    输入变量 回忆上次内容 上次研究了 一行赋值多个变量 a = b = 5 a, b = 7, 8   还研究了 标识符的惯用法 python使用的是 snake_case蛇形命名法 用下划线 分隔开小 ...

  9. 题解:P10417 [蓝桥杯 2023 国 A] 第 K 小的和

    分析 这道题不是板子么. 先对序列排序,然后二分答案,设当前答案为 \(x\),枚举 \(a\) 中的数,然后二分查找 \(b\) 中不大于 \(x-a\) 的元素个数,累加判断是否不大于 \(k\) ...

  10. P10507 Georgia and Bob 题解

    思路 对棋子坐标排序,\(x_{i}-x_{i-1}-1\) 就是棋子可以移动的距离. 移动第 \(i\) 个棋子,相当于将 \(i+1\) 的移动范围扩大. 这于是变形成了一个台阶 nim 博弈论. ...