面试题答案
一键面试package main
import (
"fmt"
)
func generateNumbers(ch chan int) {
for i := 1; i <= 100; i++ {
ch <- i
}
close(ch)
}
func calculateSquares(ch chan int) {
for num := range ch {
square := num * num
fmt.Println(square)
}
}
你可以在 main
函数中这样调用:
func main() {
ch := make(chan int)
go generateNumbers(ch)
go calculateSquares(ch)
select {}
}
通道在其中起到的作用
- 数据传递:通道作为两个 goroutine 之间的桥梁,使得生成整数的 goroutine 能够将数据安全地传递给计算平方的 goroutine。
- 同步:通道天然具有同步的特性。
generateNumbers
goroutine 在向通道发送数据时,如果calculateSquares
goroutine 还没有准备好接收,那么generateNumbers
会阻塞,直到有接收者准备好。同样,calculateSquares
goroutine 在接收数据时,如果generateNumbers
还没有发送数据,它也会阻塞。这确保了数据的有序处理,避免了竞态条件。 - 通知结束:通过
close(ch)
关闭通道,calculateSquares
goroutine 可以通过for... range
循环优雅地检测到通道关闭,从而结束循环,知道不再有数据需要处理。