Java 和 GO 中 switch 区别
Java | Go | |
---|---|---|
变量expression | byte、short、int 、 char和String | 任何类型 |
break 语句 | 如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。default不需要break | switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough |
type Switch | 无 | switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型 |
Java Switch
代码语言:javascript复制int day = 4;
switch(day){
case 1:
System.out.println("Monday");
// break;
case 2:
System.out.println("Tuesday");
// break;
case 3:
System.out.println("Wednesday");
// break;
case 4:
System.out.println("Thursday");
// break;
case 5:
System.out.println("Friday");
// break;
case 6:
System.out.println("Saturday");
// break;
case 7:
System.out.println("Sunday");
// break;
}
执行结果:
代码语言:javascript复制Thursday
Friday
Saturday
Sunday
GO switch
switch语句根据case执行相应的语句,从上至下依次判断直到匹配,但可能存在无法匹配的case,因此需要有default覆盖这些无法匹配的case。
典型场景及影响
场景#1
代码语言:javascript复制func Test(){
month:=13
switch month {
case 3,4,5:
fmt.Printf("春天")
case 6,7,8:
fmt.Printf("夏天")
case 9,10,11:
fmt.Printf("秋天")
case 12,1,2:
fmt.Printf("冬天")
}
}
在上图中,根据输入的月份month判断对应的季节,已有的case可以覆盖正常的输入,即数字在1-12的情况,但如果有异常输入的场景,假如输入是小于0或者大于12的情况,现有case无法覆盖这些场景,会使得在异常或预期之外的场景逃逸。
解决方案
方案#1
代码语言:javascript复制func TestSwitch(t *testing.T) {
month := 13
switch month {
case 3, 4, 5:
fmt.Printf("春天")
case 6, 7, 8:
fmt.Printf("夏天")
case 9, 10, 11:
fmt.Printf("秋天")
case 12, 1, 2:
fmt.Printf("冬天")
}
}
可以使用default覆盖switch中无法匹配的case,即异常或预期之外的情况。上述代码执行不会报任何错误:
代码语言:javascript复制=== RUN TestSwitch
--- PASS: TestSwitch (0.00s)
PASS
fallthrough 用法
代码语言:javascript复制switch x {
case 1:
fallthrough
case 2:
default:
}
代码语言:javascript复制func TestSwitch(t *testing.T) {
month := 3
switch month {
case 3, 4, 5:
fmt.Printf("春天")
case 6, 7, 8:
fmt.Printf("夏天")
case 9, 10, 11:
fmt.Printf("秋天")
case 12, 1, 2:
fmt.Printf("冬天")
}
}
执行结果:
代码语言:javascript复制=== RUN TestSwitch
春天--- PASS: TestSwitch (0.00s)
PASS
添加 fallthrough
代码语言:javascript复制func TestSwitch(t *testing.T) {
month := 3
switch month {
case 3, 4, 5:
fmt.Printf("春天")
fallthrough
case 6, 7, 8:
fmt.Printf("夏天")
fallthrough
case 9, 10, 11:
fmt.Printf("秋天")
fallthrough
case 12, 1, 2:
fmt.Printf("冬天")
}
}
执行结果
代码语言:javascript复制=== RUN TestSwitch
春天夏天秋天冬天--- PASS: TestSwitch (0.00s)
PASS