首页 > 后端开发 > Golang > 为什么 Go 的类型开关禁止 Fallthrough?

为什么 Go 的类型开关禁止 Fallthrough?

Mary-Kate Olsen
发布: 2024-11-16 00:35:02
原创
222 人浏览过

Why is Fallthrough Prohibited in Go's Type Switches?

类型切换中的 Fallthrough 禁止:

在 Go 中,“fallthrough”语句是一种语言结构,允许在没有显式break语句的switch语句。但是,类型开关中不允许失败。

为什么会出现这种情况?

类型开关确定表达式的类型,并将其分配给 switch case 中指定的变量。该变量表示 switch 中该点表达式的特定类型。

如果允许失败,则会出现类型不匹配问题。让我们考虑一下提供的代码片段:

//Empty interface
var x interface{}

//A int, float64, bool or string value
x = ...

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 为 true,则变量 i 被分配接口 x 中 bool 的值。如果允许失败,则执行将继续到字符串大小写。然而,此时变量 i 仍然保留 bool 值。这种类型不匹配会导致错误。

此外,fallthrough 语句在类型切换中没有意义,因为它无法更改变量 i 的类型。类型开关旨在将表达式的类型缩小为每种情况下的特定类型。允许失败会破坏这一目的。

为了实现所需的行为,可以在每种情况下使用带有显式类型转换的 switch 语句,如下所示:

switch i := x.(type) {
case bool, string:
    if b, ok := i.(bool); ok {
        fmt.Println(b) // value as bool
    } else {
        fmt.Printf("%v", i) // value as string
    }
default:
    fmt.Println("Unknown type. Sorry!")
}
登录后复制

通过使用这种方法,可以在单个 switch 语句中处理一系列类型,而无需失败。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板