这是Go中著名的“fizz buzz”程序,它使用switch/case和if/else条件。问题是当if/else(在相同条件下)工作正常时,使用switch/case会生成意外的输出。我知道golang中的switch/case与其他C系列语言不同,但是此代码片段有什么问题?

func main() {
const (
    FIZZ = 3
    BUZZ = 5
)

//section with switch/case gives unexpected output
for i := 1; i <= 30; i++ {
    switch {
    case i % FIZZ == 0:
        fmt.Printf("%d fizz\t", i%3)
        fallthrough
    case i % BUZZ == 0:
        fmt.Printf("%d buzz\t", i%5)
    }
    fmt.Printf("\t%d\n", i)
}

fmt.Printf("now towards the if/else\n")

//section with if/else works as expected
for i := 1; i <= 30; i++ {
    if i % FIZZ == 0 {
        fmt.Printf("%d fizz\t", i%3)
    }
    if i % BUZZ == 0 {
        fmt.Printf("%d buzz\t", i%5)
    }
    fmt.Printf("\t%d\n", i)
}

}

最佳答案

从golang spec:



因此,问题是:“case i%FIZZ == 0”在末尾已经掉线,因此也执行了“case i%BUZZ == 0”分支,但是未检查条件“i%BUZZ == 0”。

因此,要使用switch在golang中实现Fizz Buzz,您需要删除掉线并在顶部再添加一个case分支:play.golang.org。如您所见,“if-version”更为简洁。

07-27 21:43