Go - switch语句中的重复个案

时间:2014-04-02 23:15:33

标签: go

我是Go的新用户,在尝试删除交换机语句中的一些重复代码时,我添加了一个fallthrough的案例,如下所示:

i := 1
switch i {
case 0, 1:
    fmt.Println("common code")
    fallthrough
case 0:
    fmt.Println("aux for 0")
case 1:
    fmt.Println("aux for 1")
default:
    fmt.Println("other number")

}

但是,我收到有关重复案例的错误,例如:

prog.go:13: duplicate case 0 in switch
    previous case at prog.go:10
prog.go:15: duplicate case 1 in switch
    previous case at prog.go:10

为什么这是一个错误?有没有办法指示编译器允许这样的代码?

2 个答案:

答案 0 :(得分:4)

在当前的Go中,此行为的原因是switch的实现方式与if-else-if类似。显然,if (1) else if (1)没有意义,因此您会收到此错误。

目前,没有办法强制编译器执行此操作。你必须重写你的陈述才能获得你想要的效果。

Per this bug report comment supposedly quoting Rob Pike,此限制将在未来的Go版本中解除。

答案 1 :(得分:1)

每个值只能有一个case语句,因此该代码是非法的。另外,fallthrough只能运行一次,所以即使它按照你想要的0工作,它仍然会失败1。

最简单的解决方案是将最初的0,1个案例放在自己的交换机中或者在主交换机之前。