Go 学习笔记——Switch(我不是游戏机)
开篇
这应该是最后一篇关于语法知识的基础篇啦,其实基础知识本来应该很快就过,但因为是从头学起的,所以基础篇花的时间稍微长了一点。还是得提两句,近期的工作压力真的还是挺大的,项目一个接一个,小编我都快烦死了~~,好在最近进展都还不错。今天周五,趁着有点闲功夫,把这篇也给整理整理更了吧!
经典形式
聊回 Switch 这个语法结构,和之前的 for,if 一样,在很多其他类型的编程语言中都有支持,如果之前有学过其他的语言,我个人感觉对 Go 中对应的语法,应该是完全没有理解上的障碍的。
这里我就记几个经典形式
switch 语句,由 switch 关键字开始,后面通常接一个表达式;
switch 后面的大括号内,是一个个代码执行分支,每个分支以 case 关键字开始,后面也是一个表达式或者逗号分隔的多个表达式;
go 编译器会按照 case 的出现顺序,自上而下,由左及右(case 后接多个表达式),逐个匹配各个 case 分支,当遇到匹配项后,则 switch 语句结束,匹配项后边如果还有其他 case,也不再执行;
go 里的 switch 语句也有 default 默认分支,当没有匹配到任何 case 时,会执行默认分支,而且,不论它出现在哪里,都只会在没有任何 case 匹配的情况下才被执行;
swtich 在 go 中的特色和灵活性
swtich 中的表达式的求值结果可以为各种支持比较操作的类型值
当 switch 表达式的类型为布尔类型时,如果求值结果始终为 true,那么我们甚至可以省略 switch 后面的表达式
switch 语句支持声明临时变量,仅作用在 swtich 中的代码块中
case 语句支持表达式列表
取消了默认执行下一个 case 代码逻辑的语义,即每个 case 逻辑结束,不用加 break 关键字了(C 语言系列的语言好像都得加,C 需要,C#也需要,C++应该也需要吧,不太清楚)
fallthrough 关键字,显示实现多个 case 都执行的场景
上边这段代码,如果我不在 case1()的代码块后加 fallthrough 关键字,虽然后边 case2_2()的表达式也能匹配 Switch 条件,但也不会执行,加上关键字后,它就回去执行 case2_1(),case2_2()里的代码块,但注意,由于 fallthrough 的存在,Go 不会对 case2 的表达式做求值操作,而会直接执行 case2 对应的代码分支。而且,如果分支里都有 fallthrough 关键字,default 分支里的代码也会被执行!
特殊用例-type switch
switch 关键字后面跟着的表达式为 x.(type),这种表达式形式是 switch 语句专有的,而且也只能在 switch 语句中使用
表达式中的 x 必须是一个接口类型变量,表达式的求值结果是这个接口类型变量对应的动态类型
通过 x.(type),我们除了可以获得变量 x 的动态类型信息之外,也能获得其动态类型对应的值信息,上边的例子,(改造后如下)这里我们将 switch 后面的表达式由 x.(type)换成了 v := x.(type)。对于后者,你千万不要认为变量 v 存储的是类型信息,其实 v 存储的是变量 x 的动态类型对应的值信息,这样我们在接下来的 case 执行路径中就可以使用变量 v 中的值信息了
如果在 switch 后面使用了某个特定的接口类型 I,那么 case 后面就只能使用实现了接口类型 I 的类型了,否则 Go 编译器会报错。下面的例子,只有类型 T 实现了接口类型 I,Go 原生类型 int 与 string 都没有实现接口 I,于是在编译上述代码时,编译器会报错
跳不出循环的 break
不带 label 的 break 语句中断执行并跳出的,是同一函数内 break 语句所在的最内层的 for、switch 或 select
上边这段,预期的结果应该是输出 s1 中第一个偶数,也就是 6,但实际输出了 12。就是因为 break 并没有跳出 for 循环,只是跳出了 switch。修正后的代码可以是下面这样
修改的手段就是增加了 label 标签,break 直接的就跳到了 loop:标签外,也就修复了上面那个问题,得到了预期的结果。
ok,今天就这些了。
版权声明: 本文为 InfoQ 作者【为自己带盐】的原创文章。
原文链接:【http://xie.infoq.cn/article/284b166aa4549a97c20540db1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论