Java 和 GO 中 switch 区别

2023-07-08 15:51:51 浏览数 (2)

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

0 人点赞