让我为您深入浅出地讲解 Golang 的 Channel 概念。
1. 生活类比 🌟
想象一个咖啡店的点单流程:
- Channel 就像咖啡店的取餐窗口
- 咖啡师(生产者)将做好的咖啡放在窗口
- 服务员(消费者)从窗口取走咖啡给客人
- 窗口有限制:最多放 3-4 杯咖啡
- 如果窗口满了,咖啡师需要等待
- 如果窗口空了,服务员需要等待
2. 技术定义 📚
Channel 是 Go 语言中的一个核心概念,它提供了 goroutine 之间的通信机制,实现了 CSP(Communicating Sequential Processes)模型。
基础示例:
package main
import (
"fmt"
"time"
)
func main() {
// 创建一个容量为 3 的 channel
coffee := make(chan string, 3)
// 生产者 goroutine
go func() {
drinks := []string{"拿铁", "美式", "卡布奇诺"}
for _, drink := range drinks {
fmt.Printf("咖啡师制作了 %s\n", drink)
coffee <- drink // 将咖啡放入 channel
time.Sleep(time.Second)
}
close(coffee) // 关闭 channel
}()
// 消费者(主 goroutine)
for drink := range coffee {
fmt.Printf("服务员取走了 %s\n", drink)
}
}