类型开关与普通 Switch 语句
在 Go 中,普通 switch 语句允许失败,但类型开关不允许。虽然 Go 规范没有明确解释这种差异的原因,但它源于两种结构的根本差异。
正常 Switch 语句:
在正常情况下switch 语句中,switch 表达式计算结果为特定类型的单个常量值。然后将该值与 case 语句中的常量进行比较。如果 switch 表达式与常量匹配,则执行相应的 case 块。
普通 switch 语句中的 Fallthrough 允许执行继续到下一个 case 块,无论 switch 表达式是否与 case 常量匹配。当连续的 case 语句处理相关场景时,此行为非常有用。
类型开关:
类型开关,另一方面,将开关表达式计算为接口值。然后,在运行时动态确定接口值的类型,并将其与 case 语句中指定的类型进行比较。根据匹配情况,执行相应的 case 块。
与普通 switch 语句不同,类型开关中不允许fallthrough,因为它不能一致地应用。原因是类型 switch 中的 switch 表达式可以返回任何类型的接口值。如果允许失败,则 switch 表达式的类型将在从一个 case 块转换到下一个 case 块时发生变化。
例如,考虑以下类型 switch:
switch i := x.(type) { case int: fmt.Println(i + 1) fallthrough // Error: cannot fallthrough in type switch case float64: fmt.Println(i + 2.0) }
在此代码中,如果 switch 表达式 x 是整数,则将执行 case int 块。如果允许失败,执行将继续到 case float64 块。然而,此时,switch 表达式 i 的类型将从 int 更改为 float64。
这将导致类型一致性中断,因为后续 case 语句期望 switch 表达式为 float64。为了保持一致性,类型切换中不允许失败。
条件类型处理的替代方法:
如果您需要以条件方式处理多种类型,有是类型开关的替代方法:
以上是为什么 Go 的类型开关不允许失败?的详细内容。更多信息请关注PHP中文网其他相关文章!