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 ✅ 允许(什么都不做) ✅ 允许 ✅ 允许 ✅ 允许
相关推荐
To_OC11 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
狼爷15 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
To_OC17 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
祎雪双十Gy19 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
labixiong19 小时前
实现一个能跑的迷你版Promise(一)
前端·javascript·面试
小锋java123419 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
郝学胜_神的一滴1 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
考虑考虑1 天前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev1 天前
广播接收器 → Flow + Lifecycle
android·java·kotlin