
通过 goroutine 和 channel 可以让两个耗时函数(如 f1(2) 和 f1(1))并发执行,使总耗时由 3 秒降至最长子任务耗时(2 秒),无需修改原函数签名,仅需在调用侧引入并发机制。
在 Go 中,函数默认是顺序执行的:runNotParallel() 先阻塞等待 f1(2) 完成(2 秒),再阻塞等待 f1(1)(1 秒),总计耗时 3 秒。要实现真正的并行执行,核心思路是将函数调用“卸载”到独立 goroutine 中,并通过 channel 同步收集结果。
关键点在于:
- ✅ 无需重写 f1:它保持纯函数、无副作用、签名不变,完全兼容并发调用;
- ✅ 使用无缓冲 channel 作为同步信道:chan string 既传递结果,又天然实现“等待完成”的语义;
- ✅ goroutine 启动即执行:go func() { out1
- ✅ 主 goroutine 阻塞在 :这确保 f2 仅在两个结果都就绪后才被调用,逻辑正确性不受影响。
以下是优化后的 runParallel 实现:
func runParallel() {
out1 := make(chan string)
out2 := make(chan string)
go func() { out1 <- f1(2) }()
go func() { out2 <- f1(1) }()
// 主协程在此处等待两个 channel 同时就绪(实际是依次接收,但因并发已就绪)
f2(<-out1, <-out2)
}⚠️ 注意事项:
立即学习“go语言免费学习笔记(深入)”;
- 若 f1 内部有共享状态或非线程安全操作(如操作全局变量、未加锁的 map),需额外同步;本例中 f1 是纯函数,完全安全。
- channel 类型需与返回值严格匹配(如 string),避免类型错误。
- 不建议省略 channel 变量声明直接写 go func(c chan
✅ 总结:Go 的并发模型强调“通过通信共享内存”,用 goroutine + channel 组合替代传统回调或 Future/Promise,简洁、安全、符合 Go 的哲学。只需三步即可改造串行调用为并行:声明 channel → 启动 goroutine 写入 → 主流程读取并消费。这是 Go 并发编程最典型、最推荐的实践模式。










