Go语言中一个fallthrough的使用问题

相信学习Go语言的小伙伴对fallthrough这个关键词并不陌生,与Java、PHP等语言不同,Go语言的switch case语句不需要在每个case后面添加break语句,默认在执行完case之后,会自动break,从switch语句中转义出来。
而我们想要使程序能顺序透传到下个case中,这时我们就需要手动添加上fallthrough关键词,例如:

package mainimport ( "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 mainimport ( "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 mainimport ( "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来开发,会提示一个红色的波浪线,如图:
Go语言中一个fallthrough的使用问题
文章图片

这就表明代码是有问题的,我们看这个提示,fallthrough statement out of place,翻译过来就是fallthrough这个声明不合适,那和刚才的示例不一样了啊。我们点这个错误提示进去。
https://pkg.go.dev/golang.org...
【Go语言中一个fallthrough的使用问题】会看到有如下的说明
Go语言中一个fallthrough的使用问题
文章图片

很显然这是个错误示例,那也就是说官方不允许这样使用。
从上面的代码来看,我们使用switch判断interface{}的类型的时候,是不被允许使用fallthrough的。
这里我理解是type-switch是一种特殊的组合,专门用来判断interface{}类型的,一个interface{}也不会有两种类型。
如果您还有更好的解释,欢迎留言一起交流~~

    推荐阅读