| 特性 | 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 - 不支持,需要多个 caseswitch (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-elseObject 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 | ✅ 允许(什么都不做) | ✅ 允许 | ✅ 允许 | ✅ 允许 |