首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 和 GO 中 switch 区别

Java 和 GO 中 switch 区别

作者头像
王小明_HIT
发布于 2023-07-08 15:51:51
发布于 2023-07-08 15:51:51
4920
举报
文章被收录于专栏:程序员奇点程序员奇点

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • Java 和 GO 中 switch 区别
  • Java Switch
  • GO switch
  • 典型场景及影响
    • 场景#1
  • 解决方案
    • 方案#1
    • fallthrough 用法
    • 添加 fallthrough
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档