Java 和 GO 中 switch 区别

文章对比了Java和Go语言中switch语句的使用差异。在Java中,switch支持byte、short、int、char和String,且如果没有break,会继续执行后续case。而Go的switch更灵活,支持任何类型,并且默认不包含break,可以使用fallthrough强制执行下一个case。同时,Go还提供了typeSwitch来判断interface的实际类型。文章通过示例展示了如何处理未匹配的case,以及fallthrough的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 和 GO 中 switch 区别

JavaGo
变量expressionbyte、short、int 、 char和String任何类型
break 语句如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。default不需要breakswitch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough
type Switchswitch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型

Java Switch

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;
        }

执行结果:

Thursday
Friday
Saturday
Sunday

GO switch

switch语句根据case执行相应的语句,从上至下依次判断直到匹配,但可能存在无法匹配的case,因此需要有default覆盖这些无法匹配的case。

典型场景及影响

场景#1

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

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,即异常或预期之外的情况。
上述代码执行不会报任何错误:

=== RUN   TestSwitch
--- PASS: TestSwitch (0.00s)
PASS

fallthrough 用法

switch x {
case 1:
    fallthrough
case 2:
default:
}
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("冬天")
	}
}

执行结果:

=== RUN   TestSwitch
春天--- PASS: TestSwitch (0.00s)
PASS

添加 fallthrough

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("冬天")
	}
}

执行结果

=== RUN   TestSwitch
春天夏天秋天冬天--- PASS: TestSwitch (0.00s)
PASS

Java 和 GO 中 switch 区别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangxiaoming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值