Sta*_*nge 5 conditional fizzbuzz go fall-through
这里着名的"fizz buzz"程序在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)
}
Run Code Online (Sandbox Code Playgroud)
}
来自golang 规范:
堕落的陈述
"fallthrough"语句将控制转移到表达式"switch"语句中的下一个case子句的第一个语句.它可能仅用作此类子句中的最终非空语句.
所以问题是:"情况i%FIZZ == 0"最后有所下降,所以"case i%BUZZ == 0"分支也被执行,但是没有检查条件"i%BUZZ == 0".
因此,要在golang中使用switch实现Fizz Buzz,您需要删除它,并在顶部添加一个案例分支:play.golang.org.如您所见,"if-version"更简洁.
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |