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

相关推荐
曹牧19 小时前
C#:线程间操作无效,不是从创建控件线程访问
开发语言·c#
承渊政道21 小时前
【Python编程—从入门到实践】(Python条件判断完全入门:从布尔表达式到列表中的if实战)
开发语言·python·pycharm·条件判断·布尔表达式
小灰灰搞电子21 小时前
Rust 相关容器(集合)详解
开发语言·容器·rust
烂蜻蜓1 天前
Flask入门教程(二十六):Session API——用户会话状态管理
后端·python·flask
郑州光合科技余经理1 天前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖1 天前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利1 天前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin1 天前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c1 天前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机1 天前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring