携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
背景
有个项目需求是要按照业务制定的规则,计算订单的各项费用。因为对接的业务缺少具体文档,因此逻辑只能从业务代码中抽取出来。业务代码是PHP写的,本人是主写python和go的,在代码抽离中,有一个费用字段算出来总是和业务方的对不上,多重排查发现是对PHP switch case的理解偏差。
问题描述
业务switch case处代码简略如下:
$fee = 0
switch ($channel) {
case "A":
$fee = 1;
break;
case "B":
case "C":
$fee = 3;
break;
default:
$fee = 4;
break;
}
当时看到这段代码,想当然的翻译成:
- 当channel="A"时, fee=1;
- 当channel="B"时, fee=0;
- 当channel="C"时, fee=3;
- 当channel="D"时, fee=4。
通过实验发现,当channel= A、C、D时,没有问题,但channel="B"时,fee=3。
得出结果后,对于php这种语法很诧异。查阅相关文档才了解到,switch会一直运行代码直到找到中断位置结束。
对比golang switch case
看完php的switch case,我们再来看看golang中的switch case。
channel := "B"
fee := 0
switch channel {
case "A":
fee = 1
case "B":
case "C":
fee = 2
default:
fee = 4
}
不同输入结果如下:
- 当channel="A"时, fee=1;
- 当channel="B"时, fee=0;
- 当channel="C"时, fee=3;
- 当channel="D"时, fee=4。
结果和预期的一致,由此可见golang和php的不同点在于,golang的switch遇到匹配的case后,执行完case内的代码会直接break出来,而php中需要手动break,否则会一直往下匹配,直到找到中断位置结束。
结语
都说各种语言是相通的,但不同语言会有各自的特点。在我们学习及使用不同的语言时,应先弄清楚它的特性,也许会和自己预期的有差别,才能避免出现和文中类似的错误。