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 ✅ 允许(什么都不做) ✅ 允许 ✅ 允许 ✅ 允许
相关推荐
.千余13 小时前
【C++】C++手写Vector容器:从底层源码模拟实现
开发语言·c++·经验分享·笔记·学习
我登哥MVP13 小时前
Spring Boot 从“会用”到“精通”:参数解析原理
java·spring boot·后端·spring·servlet·maven·intellij-idea
Wenzar_14 小时前
VITS+Whisper微调:低延迟TTS实战
java·人工智能·whisper
a诠释淡然14 小时前
C++ vs Rust:哪个更适合你的下一个项目?
开发语言·c++·rust
创可贴治愈心灵14 小时前
AI浪潮下C#就业前景剖析:深耕C#为主,按需选修Java与Python
java·人工智能·c#
meilindehuzi_a14 小时前
深入理解 JavaScript 执行机制:从编译阶段到调用栈底层实现
开发语言·javascript·ecmascript
小小de风呀14 小时前
de风——【从零开始学C++】(十二):stack和queue的基本使用和模拟实现
开发语言·c++
huohaiyu14 小时前
深入解析Java垃圾回收机制
java·开发语言·算法·gc
汉克老师14 小时前
GESP6级C++考试语法知识(五十三、动态规划----背包问题(六、分组背包)
c++·动态规划·背包问题·gesp6级·gesp六级·分组背
小雨下雨的雨14 小时前
基于鸿蒙PC Electron框架技术完成的表单验证技术详解
前端·javascript·华为·electron·前端框架·鸿蒙