首页 > 后端开发 > Golang > 正文

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

Mary-Kate Olsen
发布: 2024-11-13 03:57:02
原创
413 人浏览过

Why is Fallthrough Disallowed in Go's Type Switch?

类型切换的失败:深入解释

Go 中的类型切换允许根据值的具体类型高效处理值。然而,与标准 switch-case 语句不同的是,类型 switch 中明确不允许使用fallthrough。这种设计选择引发了对其基本原理的质疑。

理解原因

Go 规范规定类型开关中不允许“fallthrough”。此禁止源于多个因素:

  • 类型不匹配: 在类型切换中,正在评估的变量根据输入的 case 分支更改类型。例如,如果变量在一个分支中分配了一个布尔值,在另一个分支中分配了一个字符串,则fallthrough将导致类型不匹配。
  • 令人困惑的行为:允许类型切换中的fallthrough会引入歧义语义。考虑一个开关,其中变量在前一个分支中被分配了布尔值。如果允许失败,则不清楚在后续分支中应如何处理该变量。它应该保留为布尔值还是成为保存布尔值或新类型值的接口?

澄清示例

用于说明问题,请考虑以下代码:

switch i := x.(type) {
case int:
    fmt.Printf("%T\n", i) // prints "int"
case bool:
    fmt.Printf("%T\n", i) // prints "bool"
    fallthrough
case string:
    fmt.Printf("%T\n", i)
}
登录后复制

如果允许失败,则不清楚是什么类型为字符串大小写打印。我是否应该保留布尔值或成为同时包含布尔值和字符串的接口{}是不明确的。

替代解决方案

虽然不允许失败类型开关,还有其他方法可以实现类似的行为:

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中文网其他相关文章!

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