首页  >  文章  >  后端开发  >  为什么 Go 的类型切换不允许 Fallthrough?

为什么 Go 的类型切换不允许 Fallthrough?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-12 19:54:02702浏览

Why is Fallthrough Not Allowed in Go's Type Switch?

类型切换中的 Fallthrough:为什么不允许?

问题:

在 Go 中,尝试使用 Fallthrough 语句在类型开关中会引发错误。为什么在这种情况下不允许fallthrough?

答案:

在类型切换中,被切换的变量根据执行的具体情况更改类型。例如,以下代码中的变量 i 的类型取决于调用的情况:

var x interface{}
switch i := x.(type) {
    case int:
        fmt.Println(i + 1)
    case float64:
        fmt.Println(i + 2.0)
    case bool:
        fallthrough
    case string:
        fmt.Printf("%v", i)
    default:
        fmt.Println("Unknown type. Sorry!")
}

如果允许失败,那么它的行为会如何?对于 bool,i 的类型为 bool。但是,在字符串的情况下,i 会被键入为字符串。

允许失败需要魔法类型变形(不可能)或变量阴影(没有有意义的值)。考虑以下示例:

switch i := x.(type) {
    case int:
        // i is an int
        fmt.Printf("%T\n", i); // prints "int"
    case bool:
        // i is a bool
        fmt.Printf("%T\n", i); // prints "bool"
        fallthrough
    case string:
        fmt.Printf("%T\n", i);
        // What is the type here? Should be "string", but what if it falls through from bool?
}

唯一可能的解决方案是让fallthrough将后续案例隐式转换为interface{},但这会令人困惑且定义不明确。

如果 switch-case 表达式所需的类型检查行为是必需的,则可以使用现有功能来实现:

switch i := x.(type) {
    case bool, string:
        if b, ok := i.(bool); ok {
            // b is a bool
        }
        // i is an interface{} that contains either a bool or a string
}

以上是为什么 Go 的类型切换不允许 Fallthrough?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn