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