乐趣区

关于golang:Go语言中一个fallthrough的使用问题

置信学习 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 来开发,会提醒一个红色的波浪线,如图:

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

会看到有如下的阐明

很显然这是个谬误示例,那也就是说官网不容许这样应用。

从下面的代码来看,咱们应用 switch 判断 interface{} 的类型的时候,是不被容许应用 fallthrough 的。

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

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

退出移动版