gpt4 book ai didi

go - 为什么这个 golang 函数_not_永远运行?

转载 作者:IT王子 更新时间:2023-10-29 02:16:54 25 4
gpt4 key购买 nike

我想尝试 FizzBu​​zz 测试 ( Why can't programmers program ),并使用了 Go。它基本上是从 1 到 100 循环,当循环计数器被 3 整除时打印“Fizz”,当被 5 整除时打印“Buzz”,当被两者整除时打印“FizzBu​​zz”,否则只打印数字。

在迭代和递归地完成之后,我想并发地(或通过使用 channel )完成它。我想出了以下代码,令我惊讶的是:

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 循环如何以及为何停止。没有中断条件,也没有返回语句。为什么它最终会结束运行?

最佳答案

效果不是很好。

一段时间后,由于剩余的 go-routine 正在等待没有 goroutine 推送的 channel ,会发生损耗。因此,您遇到的是死锁(这是结束程序的 fatal error ),而不是干净的结束。

总而言之,它“有效”是因为 go 引擎足够智能,可以检测到死锁。

关于go - 为什么这个 golang 函数_not_永远运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25649384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com