go中的channel

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


🧠 基本概念

go 复制代码
ch := make(chan int) // 创建一个传输 int 类型的 channel

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

go 复制代码
ch <- 10     // 发送数据到 channel
x := <-ch    // 从 channel 接收数据

🧪 示例:Goroutine 之间通信

go 复制代码
package main

import "fmt"

func worker(ch chan string) {
    ch <- "hello from worker" // 发送数据
}

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

📌 Channel 的类型

1. 无缓冲 channel(默认)

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

2. 带缓冲 channel

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

🚧 关闭 channel

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

🚦 select 多路复用

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

go 复制代码
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 通信
  • 并发控制(信号量)
  • 任务队列
  • 发布/订阅模型

相关推荐
轻刀快马4 分钟前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
gCode Teacher 格码致知15 分钟前
Javascript技术:CSS 中rem、vh 和 px各有其最佳适用场景-由Deepseek产生
开发语言·javascript·css
超皮小龙猫34 分钟前
c语言-1
c语言·开发语言
锋行天下43 分钟前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端
IManiy1 小时前
总结之Vibe Coding:了解后端
后端
神奇小汤圆1 小时前
全网最全 Claude Code 命令指南:会话、权限、扩展、自动化全搞定!从新手到大神,这一篇就够了
后端
神奇小汤圆1 小时前
从0开始,在国内用上Claude Code的终极保姆教程来了。
后端
郝学胜-神的一滴1 小时前
完全二叉树与堆底层原理深度剖析 | 手写C++大顶堆实现
java·开发语言·数据结构·c++·python·算法
砍材农夫1 小时前
物联网实战|Spring Boot + Netty 搭建 MQTT 消息路由与流转层
java·spring boot·后端·物联网·spring
黄毛火烧雪下1 小时前
Java 基础笔记:文件、递归与字符编码
java·开发语言·笔记