5

这是 Go 中著名的“嘶嘶声”程序,它使用 switch/case 和 if/else 条件。问题是使用 switch/case 会产生意外的输出,而 if/else(具有相同的条件)工作正常。我知道 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)
}

}

4

3 回答 3

6

来自 golang规范

失败声明

“fallthrough”语句将控制转移到表达式“switch”语句中下一个 case 子句的第一个语句。它只能用作此类子句中的最终非空语句。

所以问题是:“case i % FIZZ == 0”最后已经失败,所以“case i % BUZZ == 0”分支也被执行,但条件“i % BUZZ == 0”没有被检查。

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

于 2013-09-11T13:56:03.353 回答
3

您可以i%15使用fizzbuzz. 此选项可提高性能。一个数字 - 一个除法和一个系统调用 (sys_write)。并且不用担心fallthrough

func main() {

    const (
        FIZZ = 3
        BUZZ = 5
        FIZZBUZZ = 15
   )

    for i := 1; i <= 30; i++ {
        switch {
        case i % FIZZBUZZ == 0:
            fmt.Printf("%d fizzbuzz\n", i)
        case i % FIZZ == 0:
            fmt.Printf("%d fizz\n", i)
        case i % BUZZ == 0:
            fmt.Printf("%d buzz\n", i)
        default:
             fmt.Printf("%d\n", i)
        }
   }
}
于 2014-09-19T20:52:39.207 回答
0
//Example - between 1 and 100.

    for i := 1; i <= 100; i++ {
        output := ""
        if i%3 == 0 {
            output += "Fizz"
        }
        if i%5 == 0 {
            output += "Buzz"
        }
        if output == "" {
            fmt.Println(i)
        } else {
            fmt.Println(output)
        }
    }
于 2021-04-01T19:59:54.993 回答