类型切换中的 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中文网其他相关文章!