我想尝试 FizzBuzz 测试(为什么程序员不能编程),并使用了 Go。它基本上是从 1 到 100 循环,当循环计数器可被 3 整除时打印“Fizz”,当可被 5 整除时打印“Buzz”,当可被两者整除时打印“FizzBuzz”,否则只打印数字。
在迭代和递归完成之后,我想同时(或通过使用通道)完成它。我想出了以下代码,令我惊讶的是:
func fizzbuzzconc() {
// Channels for communication
fizzchan := make(chan int)
buzzchan := make(chan int)
fizzbuzzchan := make(chan int)
nonechan := make(chan int)
// Start go routine to calculate fizzbuzz challenge
go func() {
for i := 1; i <= 100; i++ {
if i % 3 == 0 && i % 5 == 0 {
fizzbuzzchan <- i
} else if i % 3 == 0 {
fizzchan <- i
} else if i % 5 == 0 {
buzzchan <- i
} else {
nonechan <- i
}
}
}()
// When or how does this for loop end?
for {
select {
case i := <-fizzchan:
fmt.Println(i, "Fizz")
case i := <-buzzchan:
fmt.Println(i, "Buzz")
case i := <-fizzbuzzchan:
fmt.Println(i, "FizzBuzz")
case i := <-nonechan:
fmt.Println(i, i)
}
}
}
我不明白 for 循环如何以及为什么停止。没有中断条件或返回语句。为什么它最终会结束运行?