我有以下代码:

package main

import (
    "fmt"
)

func main() {

    switch num := 75; { //num is not a constant
    case num < 50:
        fmt.Printf("%d is lesser than 50\n", num)
    case num < 100:
        fmt.Printf("%d is lesser than 100\n", num)
    case num < 60:
        fmt.Printf("%d is lesser than 60", num)
    case num < 200:
        fmt.Printf("%d is lesser than 200", num)
    }
}

如果我要执行下一种情况,则可以使用fallthrough,但它不会根据情况检查条件。我需要检查条件:即使遇到一种情况,我也想继续正常进行切换。

我也想用fallthrough检查下一个情况,有什么办法可以做到?

最佳答案

简短答案:,您不能使用case检查后续的fallthrough条件,因为fallthrough是无条件的,会强制执行下一种情况。这就是它的目的。

长答案:您仍然可以使用fallthrough:如果在这种情况下仔细观察,您只需要按照有意义的方式对案例重新排序即可。请注意,对于一般情况,这是不正确的。

switch num := 75; {
case num < 50:
    fmt.Printf("%d is less than 50\n", num)
    fallthrough // Any number less than 50 will also be less than 60
case num < 60:
    fmt.Printf("%d is less than 60\n", num)
    fallthrough // Any number less than 60 will also be less than 100
case num < 100:
    fmt.Printf("%d is less than 100\n", num)
    fallthrough // Any number less than 100 will also be less than 200
case num < 200:
    fmt.Printf("%d is less than 200\n", num)
}

这样,您就可以安全地使用fallthrough,因为由于条件的排序正确,所以您已经知道,如果num通过其中一个条件,那么显然也将通过每个后续条件。

此外,如果您实际上不想简单地将fallthrough转换为下一个大小写,而是想要执行另一种情况,则可以添加带标签的大小写,并使用goto跳至该大小写。
switch num := 75; {
firstCase:
    fallthrough
case num < 50:
    fmt.Println("something something\n")
case num < 100:
    fmt.Printf("%d is less than 100\n", num)
    goto firstCase
}

查看Go GitHub Wiki here了解更多信息。

顺便说一句,如果您使用的是switch语句,并且需要强制执行一些不自然的大小写处理,那么您可能将整个事情做错了:考虑使用另一种方法,例如嵌套的if语句。

关于go - 执行多个开关案例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50984814/

10-11 04:28