类型切换的失败:深入解释
Go 中的类型切换允许根据值的具体类型高效处理值。然而,与标准 switch-case 语句不同的是,类型 switch 中明确不允许使用fallthrough。这种设计选择引发了对其基本原理的质疑。
理解原因
Go 规范规定类型开关中不允许“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中文网其他相关文章!