相信学习Go语言的小伙伴对fallthrough这个关键词并不陌生,与Java、PHP等语言不同,Go语言的switch case语句不需要在每个case后面添加break语句,默认在执行完case之后,会自动break,从switch语句中转义出来。

而我们想要使程序能顺序透传到下个case中,这时我们就需要手动添加上fallthrough关键词,例如:

package main

import (
    "fmt"
    "time"
)

func main() {
    switch num := time.Now().Month(); {
    case num <= 3:
        fmt.Println("当前是第一季度")
    case num > 6:
        fmt.Println("当前是下半年")
    default:
        fmt.Println("未知月份")
    }
}

执行后结果当然会输出:当前是第一季度

而不会继续执行,输出“当前是下半年”或是“未知年份”的提示。

这时我可以使用fallthrough关键词来强制执行下面的case语句的内容。

package main

import (
    "fmt"
    "time"
)

func main() {
    switch num := time.Now().Month(); {
    case num <= 3:
        fmt.Println("当前是第一季度")
        fallthrough
    case num > 6:
        fmt.Println("当前是下半年")
    default:
        fmt.Println("未知月份")
    }
}

这时执行代码后,会输出

当前是第一季度

当前是下半年

这里我们需要注意一下,fallthrough的透传会直接传递给下一个case,而不会去判断下一个case的条件。

但有一种情况是无法使用fallthrough来进行透传的,示例如下:

package main

import (
    "fmt"
)

func main() {
    var num interface{}
    var num1 int = 1
    num = num1
    switch num.(type) {
    case int:
        fmt.Printf("当前num类型是:%T\n", num)
    fallthrough
    case float64:
        fmt.Printf("当前num类型是:%T\n", num)
    default:
        fmt.Printf("当前num类型是:%T\n", num)
    }
}

这时候,如果你使用vscode来开发,会提示一个红色的波浪线,如图:

image.png

这就表明代码是有问题的,我们看这个提示,fallthrough statement out of place,翻译过来就是fallthrough这个声明不合适,那和刚才的示例不一样了啊。我们点这个错误提示进去。
https://pkg.go.dev/golang.org...

会看到有如下的说明

image.png

很显然这是个错误示例,那也就是说官方不允许这样使用。

从上面的代码来看,我们使用switch判断interface{}的类型的时候,是不被允许使用fallthrough的。

这里我理解是type-switch是一种特殊的组合,专门用来判断interface{}类型的,一个interface{}也不会有两种类型。

如果您还有更好的解释,欢迎留言一起交流~~


Jankin
15 声望4 粉丝

每天进步一点点