”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Go 的类型切换不允许 Fallthrough?

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

发布于2024-11-17
浏览:460

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)
}

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

替代解决方案

虽然在type 开关,还有其他方法可以实现类似的行为:

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
}

此方法允许对不同类型进行更具体的处理,而不会引入类型不匹配或歧义。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3