Fork me on GitHub

Go语言开发-过程式编程-switch语句-表达式开关

5.2.2.1. 表达式开关

Go语言的表达式开关语法如下:

如果使用了可选声明,则分号是必需的,而不管其中是否使用了可选表达式。每个case块都由零个或多个语句组成。

如果switch语句中没有任何可选表达式,则编译器会假定表达式的值为true。可选声明与简单语句是一样的,后者可以用于if语句中。如果变量是在可选声明中创建的(例如,使用了:=操作符),则其作用域为其声明开始处直到整个switch语句结尾,所以在每个case块和default语句块中都可以直接访问这些变量,直到switch结束。

执行效率最高的case顺序是按最有可能到最没可能,虽然这只有在当有很多case子句且多次执行该switch语句时才重要。因为case子句并不会自动向下贯通,所以无需在每个case子句块结尾都添加一个break关键字。如果我们需要向下贯通,我们可以简单地使用一个fallthrough语句来实现。default子句是可选的且可以放置在任何位置。如果所有的case表达式都不匹配,则执行default子句;如果没有default子句,则程序会直接跳出switch,继续执行之后的语句。

每个case子句必须含有一个或多个分号分隔的与switch语句中的可选表达式类型相匹配的表达式。如果没有使用可选表达式,则编译器会将其设置为true,即一个布尔类型的值,在这种情况下,每个case子句中的每个表达式的值就必须是一个布尔类型的值。

如果一个case或default子句含有一个break语句,程序会立即跳出该switch并继续执行之后的代码,或者,如果break语句声明了一个label,则程序会继续执行最内层的声明了该label的for、switch和select语句块。

下面是一个关于switch语句的简单例子,其没有可选声明和可选表达式。

因为没有可选表达式,所以编译器将表达式的值设置为true。这意味着,每个case子句中的表达式的值都必须是布尔类型,上面的两个表达式都使用了布尔比较运算符。

上面是BoundedInt() 函数的另一种实现方式。其中switch块中涵盖了每种可能的情况,所以switch语句块后面的代码永远不会被执行到。尽管如此,Go语言仍然希望能在函数的结尾处添加一个return或panic()语句,所以我们使用了上面的代码来更好地表示函数的语意。

在前一小节中所示的ArchiveFi1eList()函数使用了一个if语句来决定要调用哪个函数。下面是一个原生的基于switch的例子。

上面的switch语句含有一个声明语句和一个表达式语句。这里的表达式语句是string类型的,所以每个case子句的表达式列表必须含有一个或多个以逗号分隔的要匹配的字符串。我们使用了fallthrough来确保所有tar后缀的文件都由同一个函数来处理。

变量suffix的作用域为整个switch语句块,包括每个case子句(也包括default子句,如果存在的话),在switch语句块之后该变量便不再存在。

上面的是之前switch语句的更加紧凑和标准化的形式。这里我们只是简单的使用了一个表达式:返回一个string类型的Suffix()函数,而不是使用一个声明语句和一个表达式。并且我们使用了一个逗号分隔的包含所有匹配的列表作为case子句的表达式列表,而不是使用fallthrough语句。Go语言的switch语句表达式比C、C++和Java中的更加强大,在很多情况下,可以替代if语句,还可以比if语句更加简洁紧凑。


目录


作者:Johnson
原创文章,版权所有,转载请保留原文链接。

发表评论

电子邮件地址不会被公开。 必填项已用*标注