golang中一种不常见的switch语句怎么写


这篇文章主要介绍了golang中一种不常见的switch语句怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang中一种不常见的switch语句怎么写文章都会有所收获,下面我们一起来看看吧。注意这里讨论的不是typed switch,也就是case语句后面是类型的那种。直接看代码:你也可以在这找到它:代码链接简单解释下这段代码在做什么:调用systemctl命令检查指定的服务的运行状态,具体做法是过滤systemctl的输出然后根据得到的字符串的前缀判断当前的运行状态。有意思的在于这个switch,首先它后面没有任何表达式;其次在每个case后面都是个函数调用表达式,返回值都是bool类型的。虽然看起来很怪异,但这段代码肯定没有语法问题,可以编译通过;也没有语义或者逻辑问题,因为人家用的好好的,这个项目接近4000个星星不是大家乱点的。这里就不卖关子了,直接公布答案:如果switch后面没有任何表达式,那么它等价于这个:switch true;case表达式按从上到下从左到右的顺序求值;如果case后面的表达式求出来的值和switch后面的表达式的值一样,那么就进入这个分支,其他case被忽略(除非用了fallthrough,但这会直接跳进下一个case的分支,不会执行下一个case上的表达式)。那么上面那一串代码就好理解了:首先是switch true,期待有个case能求出true这个值;从上到下执行strings.HasPrefix,如果是false就往下到下一个case,如果是true就进入这个case的分支。它等价于下面这段:可以看到,光从可读性上来说的话两者很难说谁更优秀;两者同样需要注意把常见的情况放在最前面来减少不必要的匹配(这里的switch-case不能像给整数常量时那样直接进行跳转,实际执行和上面给出的if语句是差不多的)。那么我们再来看看两者的生成代码,通常我不喜欢去研究编译器生成的代码,但这次是个小例外,对于执行流程上很接近的两段代码,编译器会怎么处理呢?我们做个简化版的例子:这是switch版本的汇编:我把inline给关了,不然hasprefix内联出来的东西会导致整个汇编代码难以阅读。上面的代码还是很好理解的,“active”和“inactive”的case被放在一起,如果匹配到了就跳转进入对应的分支;“activing”和“failed”的case也放在了一起,匹配到之后的操作与前面两个case一样(实际上上面两个case的匹配执行完就会跳转到这两个,至于为啥要多一次跳转我没深究,可能是为了提高L1d的命中率,一大块指令可能会导致缓存里放不下从而付出更新缓存的代价,而有流水线优化的情况下一个jmp带来的开销可能低于缓存未命中的惩罚,不过这在实践里很难测量,权当我在自言自语也行)。最后那一串带ret的语句块就是对应的case的分支。再来看看if的代码:除了函数名子不一样之外,其他是一模一样的,可以说两者在生成代码上也没有区别。你可以在这里看到代码和他们的编译产物:Compiler Explorer既然生成代码是一样的,那性能就没必要测量了,因为肯定是一样的。最后总结一下这种不常用的switch写法,形式如下:考虑到在性能上这并没有什么优势,而且对于初次见到这个写法的人可能不能很快理解它的含义,所以这个写法的使用场景我目前能想到的只有一处:如果你的数据有固定的2种以上的前缀/后缀/某种模式,因为没法用固定的常量去表示这种情况,那么用case加上一个简单的表达式(函数调用之类的)会比用if更紧凑,也能更好地表达语免费云主机域名义,case越多效果越明显。比如我在开头举的那个例子。如果你的代码不符合上述情况,那还是老老实实用if会更好。关于“golang中一种不常见的switch语句怎么写”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“golang中一种不常见的switch语句怎么写”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: 怎么将JSP转换成HTML

本文小编为大家详细介绍“怎么将JSP转换成HTML”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么将JSP转换成HTML”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 一、什么是JSPJSP(Java Server Pages)…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/07 20:16
下一篇 07/07 20:17

相关推荐