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 ✅ 允许(什么都不做) ✅ 允许 ✅ 允许 ✅ 允许
相关推荐
microrain2 分钟前
读数是 1008,用电量是 8:SagooIoT 计算服务的增量口径与七种计算策略
物联网·golang·计算服务·sagooiot
SL_staff11 分钟前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
Shaoshing23 分钟前
前缀和与差分
java·数据结构·算法·前缀和·差分
dd聊技术41 分钟前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76891 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY1 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty
蚰蜒螟1 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
会编程的吕洞宾1 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring
bmxy小明同学1 小时前
2026-10-09-token与成本
java·前端·数据库
jimy11 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++