golang 、java、c++、javascript 语言switch case异同

特性 Go Java C++ JavaScript
默认行为 自动跳出 自动穿透 自动穿透 自动穿透
穿透关键字 fallthrough (不写break) (不写break) (不写break)
case 多值 ✅ 支持 ❌ 不支持 ❌ 不支持 ❌ 不支持
switch 后无表达式 ✅ 支持 ❌ 不支持 ❌ 不支持 ❌ 不支持
case 可以是表达式 ✅ 支持* ❌ 需常量 ❌ 需常量 ❌ 需常量
类型开关 v.(type) ❌ (用instanceof) ❌ (用typeid) ❌ (用typeof)
case 变量作用域 独立 共享整个switch 共享整个switch 共享整个switch
fallthrough 穿透后 无条件执行下个case 无此概念 无此概念 无此概念

*注:Go 在使用 switch {}(无表达式)时 case 可以是任意布尔表达式

1. 默认行为(最大区别)

// Go - 自动跳出

n := 1

switch n {

case 1:

fmt.Println("一") // 只输出"一"

case 2:

fmt.Println("二") // 不会执行

}
// Java - 自动穿透

int n = 1;

switch (n) {

case 1:

System.out.println("一"); // 输出"一"

// 需要 break 才能跳出

case 2:

System.out.println("二"); // 也会执行!输出"二"

break;

}

复制代码
JavaScript - 同 Java
复制代码
C++ - 同 Java/JS

2. case 多值支持

// ✅ Go - 支持多值

switch day {

case "周六", "周日":

fmt.Println("周末")

case "周一", "周二", "周三", "周四", "周五":

fmt.Println("工作日")

}
// ❌ Java - 不支持,需要多个 case

switch (day) {

case "周六":

case "周日":

System.out.println("周末");

break;

case "周一":

case "周二":

case "周三":

case "周四":

case "周五":

System.out.println("工作日");

break;

}

JS/C++ 同 Java,都不支持 case 多值。

3. switch 后无表达式(条件判断)

// ✅ Go - 可以没有表达式

score := 85

switch {

case score >= 90:

fmt.Println("A")

case score >= 80:

fmt.Println("B")

case score >= 70:

fmt.Println("C")

default:

fmt.Println("D")

}
// ❌ Java - 必须写表达式

int score = 85;

switch (score) { // 只能检查 score 的值

case 90: // 只能匹配具体值

// ...

}

// 区间判断只能用 if-else

JS/C++ 同 Java,必须写表达式。

JS/C++ 同样要求 case 必须是常量表达式。

4. case 表达式类型

// ✅ Go - case 可以是复杂表达式

n := 5

switch {

case n > 0 && n < 10:

fmt.Println("1-9之间")

case n >= 10:

fmt.Println("10及以上")

}

5. 类型开关

// ✅ Go - 类型开关

var x interface{} = "hello"

switch v := x.(type) {

case string:

fmt.Println("字符串:", v)

case int:

fmt.Println("整数:", v)

}
// ⚠️ Java - 用 instanceof 和 if-else

Object x = "hello";

if (x instanceof String) {

String v = (String) x;

System.out.println("字符串: " + v);

} else if (x instanceof Integer) {

Integer v = (Integer) x;

System.out.println("整数: " + v);

}

JS 用 typeof + if-else,C++ 用 typeid + if-else

6. fallthrough 穿透行为

// Go - fallthrough 无条件执行下一个 case

n := 1

switch n {

case 1:

fmt.Println("1")

fallthrough // 强制进入下一个 case

case 2:

fmt.Println("2") // 会被执行

}

// 输出:1 2
// Java - 没有 fallthrough,穿透是默认行为

int n = 1;

switch (n) {

case 1:

System.out.println("1");

// 没有 break,自动穿透

case 2:

System.out.println("2");

break;

}

// 输出:1 2

复制代码
📋 完整对比表
场景 Go Java C++ JavaScript
多值匹配 case 1,2,3: 多个 case 堆叠 多个 case 堆叠 多个 case 堆叠
区间判断 switch {} 后写条件 if-else if-else if-else
字符串匹配 ✅ 原生支持 ✅ 支持 (Java 7+) ❌ 不支持 ✅ 支持
变量作用域 每个 case 独立 整个 switch 共享 整个 switch 共享 整个 switch 共享
default 位置 任意位置 通常最后 通常最后 通常最后
空 case ✅ 允许(什么都不做) ✅ 允许 ✅ 允许 ✅ 允许
相关推荐
我命由我123451 小时前
Android Framework P1 - 低配学习 Framework 方案、开机启动 Init 进程
android·c语言·c++·学习·android jetpack·android-studio·android runtime
许长安1 小时前
互斥锁、自旋锁、读写锁使用场景以及底层实现
c++·经验分享·笔记
Season4501 小时前
C++11并发支持库(condition_variable | future全家桶)
java·jvm·c++
阿Y加油吧1 小时前
二刷 LeetCode:爬楼梯与杨辉三角,Java 实现复盘
java·算法·leetcode
落羽的落羽1 小时前
【项目】C++从零实现JsonRpc框架——项目引入
linux·服务器·开发语言·c++·人工智能·算法·机器学习
不知名的忻1 小时前
堆排序(Java)
java·数据结构·算法·排序算法
TAN-90°-1 小时前
Java 5——final 抽象 接口
java·开发语言
Andy1 小时前
C++ 容器适配器_栈_队列_双端队列
开发语言·网络·c++
吴声子夜歌1 小时前
Java——显示锁
java·开发语言