当前位置: 首页 > news >正文

go中的channel

Go(Golang)中的 channel 是一种 并发原语,用于 Goroutine 之间的通信。它就像是一条管道,允许你在不同的 goroutine 之间安全地传递数据。


🧠 基本概念

ch := make(chan int) // 创建一个传输 int 类型的 channel

你可以使用 <- 操作符向 channel 发送接收 数据:

ch <- 10     // 发送数据到 channel
x := <-ch    // 从 channel 接收数据

🧪 示例:Goroutine 之间通信

package mainimport "fmt"func worker(ch chan string) {ch <- "hello from worker" // 发送数据
}func main() {ch := make(chan string)go worker(ch)         // 启动 goroutinemsg := <-ch           // 主线程阻塞等待接收fmt.Println(msg)      // 打印:hello from worker
}

📌 Channel 的类型

1. 无缓冲 channel(默认)

  • make(chan int)
  • 发送/接收操作必须同步,否则会阻塞。

2. 带缓冲 channel

ch := make(chan int, 3)
  • 可以最多缓存 3 个值。
  • 发送不会立刻阻塞,直到缓冲区满。

🚧 关闭 channel

close(ch)
  • 表示你不会再向 channel 发送数据了。
  • 接收方可以通过判断是否关闭:
v, ok := <-ch
if !ok {fmt.Println("channel closed")
}

🚦 select 多路复用

select 用于等待多个 channel 中的操作:

select {
case msg1 := <-ch1:fmt.Println("received", msg1)
case msg2 := <-ch2:fmt.Println("received", msg2)
default:fmt.Println("no message")
}

🛑 注意事项

  • 向关闭的 channel 发送数据会 panic。
  • 接收已关闭 channel 的值不会 panic,而是会读到零值。
  • channel 是并发安全的,但读写需注意逻辑死锁。

🧭 应用场景

  • Goroutine 通信
  • 并发控制(信号量)
  • 任务队列
  • 发布/订阅模型

相关文章:

  • Python Day34 学习
  • AXI3、AXI4 和 AXI5 的详细差异对比
  • Python条件语句完全指南:从if-else到模式匹配
  • NAT的映射类型详解:从基础到高级应用
  • Halcon联合QT ROI绘制
  • Spring Boot事务失效场景及解决方案
  • 超大规模模型训练中的 ZeRO 优化器与混合精度通信压缩技术
  • 【JavaSE】枚举和注解学习笔记
  • 编程日志5.27
  • AI情感陪伴在医疗领域的核心应用潜力
  • 彻底理解一个知识点的具体步骤
  • 西门子-队列
  • 第1章 Redis 概述
  • 【C++】类和对象(上)
  • 每日算法 -【Swift 算法】实现回文数判断!
  • endnote2025安装教程以及激活文件
  • 软考 系统架构设计师系列知识点之杂项集萃(77)
  • 修复SSH 服务支持弱加密算法漏洞
  • 【实战】Tennis-Tracking 安装与运行完整教程(含 CUDA/TF 报错解决)
  • C++优先队列(priority_queue)使用详解
  • 普通话测试网站建设需要几天/相城seo网站优化软件
  • 推广策略组合/seo技术外包
  • 外贸网站建设免费/发软文的平台
  • 嘉兴企业网站建设推广/嵌入式培训班一般多少钱
  • 装修网站建设方案书/全球最受欢迎的网站排名
  • jsp做就业网站/中国最新消息今天