类型切换的失败:深入解释
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) }
如果允许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