为什么类型开关不允许失败?

问题描述 投票:0回答:2

我想知道为什么 golang 中的类型 switch 语句不允许失败。

根据规范:“类型开关中不允许使用“fallthrough”语句。”,这并没有解释为什么不允许它。

所附代码用于模拟可能的场景,类型 switch 语句中的失败可能会很有用。

注意! 此代码不起作用,它会产生错误:“无法在类型切换中失败”。我只是想知道在类型切换中不允许使用 Fallthrough 语句可能的原因是什么。

//A type switch question
package main

import "fmt"

//Why isn't fallthrough in type switch allowed?
func main() {
    //Empty interface
    var x interface{}

    x = //A int, float64, bool or string value

    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!")
    }
}
switch-statement go
2个回答
51
投票

您希望

fallthrough
如何发挥作用?在此类型开关中,
i
变量的类型取决于所调用的特定情况。因此,在
case bool
中,
i
变量的类型为
bool
。但在
case string
中,它被输入为
string
。因此,要么您要求
i
神奇地改变其类型,这是不可能的,要么您要求它被新变量
i string
遮蔽,该变量将没有任何值,因为它的值来自
x
事实上,这不是
string


这是一个尝试说明问题的示例:

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 does that type? It should type "string", but if
    // the type was bool and we hit the fallthrough, what would it do then?
}

唯一可能的解决方案是使

fallthrough
导致后续的 case 表达式将
i
保留为
interface{}
,但这将是一个令人困惑且糟糕的定义。

如果您确实需要此行为,您已经可以使用现有功能来完成此操作:

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
}

0
投票

很难说为什么不允许失败。

但是你可以这样做:

case bool, string:
,例如:

var x interface{}
//x = ...

switch i := x.(type) {
case int:
    fmt.Println(i + 1)
case float64:
    fmt.Println(i + 2.0)
case bool, string: // almost like a fallthrough. i is interface{}
    fmt.Printf("%v", i)
default:
    fmt.Println("Unknown type. Sorry!")
}
© www.soinside.com 2019 - 2024. All rights reserved.