问题:
在 Go 中,尝试使用 Fallthrough 语句在类型开关中会引发错误。为什么在这种情况下不允许fallthrough?
答案:
在类型切换中,被切换的变量根据执行的具体情况更改类型。例如,以下代码中的变量 i 的类型取决于调用的情况:
var x interface{} 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,i 的类型为 bool。但是,在字符串的情况下,i 会被键入为字符串。
允许失败需要魔法类型变形(不可能)或变量阴影(没有有意义的值)。考虑以下示例:
switch i := x.(type) { case int: // i is an int fmt.Printf("%T\n", i); // prints "int" case bool: // i is a bool fmt.Printf("%T\n", i); // prints "bool" fallthrough case string: fmt.Printf("%T\n", i); // What is the type here? Should be "string", but what if it falls through from bool? }
唯一可能的解决方案是让fallthrough将后续案例隐式转换为interface{},但这会令人困惑且定义不明确。
如果 switch-case 表达式所需的类型检查行为是必需的,则可以使用现有功能来实现:
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中文网其他相关文章!