题目
使用Goroutine并发打印数字序列
信息
- 类型:问答
- 难度:⭐
考点
Goroutine创建,并发基础,Channel通信
快速回答
实现要点:
- 使用
go关键字启动Goroutine - 通过Channel在主Goroutine和子Goroutine间同步数据
- 主Goroutine等待子Goroutine完成
题目要求
编写Go程序,启动一个Goroutine并发打印数字1-5,主Goroutine打印数字6-10,要求输出顺序为1-10连续排列。
原理说明
Goroutine是Go语言的轻量级线程,由Go运行时管理。Channel是Goroutine间的通信管道,提供同步机制:
- 无缓冲Channel发送/接收操作会阻塞,直到另一方准备好
- 通过Channel同步可控制Goroutine执行顺序
代码示例
package main
import "fmt"
func main() {
// 创建同步Channel
ch := make(chan bool)
// 启动Goroutine
go func() {
// 打印1-5
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
// 通知主Goroutine
ch <- true
}()
// 等待子Goroutine完成
<-ch
// 打印6-10
for i := 6; i <= 10; i++ {
fmt.Println(i)
}
}最佳实践
- 明确同步点:使用Channel明确Goroutine间的依赖关系
- 资源清理:生产代码中需处理Channel关闭
- 错误处理:通过select实现超时控制防止死锁
常见错误
- 缺少同步:未使用Channel导致主Goroutine提前退出
- 死锁:Channel发送/接收不匹配
- 数据竞争:共享变量未加锁(本例未涉及)
扩展知识
- WaitGroup:
sync.WaitGroup更适合等待多个Goroutine - 缓冲Channel:
make(chan bool, 1)允许异步通信 - 并发模式:Worker Pool、Pipeline等高级模式