switch语句
switch
语句是条件语句的一种。switch
语句先计算一个表达式的值,然后将计算出来的值跟一列可能值进行比较,匹配到哪种情况就执行哪个代码块。switch
语句可以等价于多个if else
语句。
也许举个例子更加容易理解,下面我们写一个程序,根据数字输出对应的手指名称。比如1表示大拇指,2表示食指。
Go Playground在线运行 该程序中switch finger
语句将finger
的值跟每一个case
值从前到后依次去比较,匹配上会执行对应的代码块。由于switch finger
语句执行时finger
值为4,因此case 4
对应的代码块得以执行,打印出Ring
。
switch
语句中case
值不允许重复,例如下面的程序有两个case
值均为4,会报错:
兜底case
前面程序中用手指做例子来说明switch
语句用法。我们一只手上只有5个手指,因此可以匹配到数字1到5。那如果前面给finger
赋值为其他错误的值,比如6,怎么办?这时兜底case就派上用场了。
Go Playground在线运行 这里由于finger
值为8,无法匹配到任何一个case
值,因此会执行兜底case的代码块,打印出incorrect finger number
。
细心的话你会注意到,我们将finger
的初始化置于了switch
语句内。这点跟if else
语句类似,均支持这种用法。这种方式初始化finger
值,finger
仅在switch
语句内部可见。
case合并
如果要执行的代码块相同,我们可以将多个case合并成一条语句。比如下面判断元音字母的程序:
Go Playground在线运行 该程序判断letter
变量是否是元音字母,case "a", "e", "i", "o", "u"
语句将多种情况(所有元音字母)合并成了一条case
语句。
switch true
switch true
如果要执行的switch
语句为switch true
,则可简写将表达式true
省去。注意这时case
值都是跟true
比较。
Go Playground在线运行 该程序中num
值为75,case num >= 51 && num <= 100
判断通过,因此打印num is greater than 51 and less than 100
。其实我们简单思考下就应该知道,这种用法完全可用if else
语句替换。
fallthrough
细心的话就会发现,Golang中的case
语句跟JavaScript
等其他编程语言不同,不需要break
语句即可在执行完匹配上的代码块后立即退出整个switch
语句。那么如果希望继续判断并匹配后序的case
语句怎么实现呢?也有办法,就是用fallthrough
。
Go Playground在线运行 该程序中num
值为75,因此case num < 100
判断通过,执行对应的代码块,由于使用了falltrough
,因此执行流程向后贯穿,接着去匹配其他的case
。由于case num < 200
也判断通过,因此也执行对应的代码块。该程序输出如下:
有过其他编程语言经验的人都应该知道,我们大部分情况下都会使用switch
语句的break
来退出switch
语句,因此Golang的设计更加优雅。从这一点上也不得不说,Golang确实是取其精华,去其糟粕。
需要注意fallthrough
必须在case
代码块的最后执行,否则会报错。
另外还有一个type switch
语句,我们后面介绍接口时再讨论。
Last updated
Was this helpful?