Goroutine 与 Channel:并发的最小模型
goroutine 是由 Go 运行时调度的轻量并发执行单元,使用 go 关键字启动。channel 用于在 goroutine 间传递类型化数据和同步。
func square(input <-chan int, output chan<- int) {
for value := range input {
output <- value * value
}
close(output)
}
<-chan int 表示只接收 channel,chan<- int 表示只发送 channel。明确方向能让编译器帮助限制误用。
不要用 sleep 等待并发完成
应使用 channel、sync.WaitGroup 或 context 协调完成和取消,而不是猜测“睡几秒应该够了”。无缓冲 channel 的发送和接收会彼此同步;缓冲 channel 只是在缓冲未满时允许发送先继续执行,并不自动解决生命周期管理。
并发不是默认优化。先写出正确的串行版本;只有任务独立、资源允许且能够处理取消、错误和共享数据时,再引入并发。