特性GoJavaC++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

📋 完整对比表
场景GoJavaC++JavaScript
多值匹配case 1,2,3:多个 case 堆叠多个 case 堆叠多个 case 堆叠
区间判断switch {} 后写条件用 if-else用 if-else用 if-else
字符串匹配✅ 原生支持✅ 支持 (Java 7+)❌ 不支持✅ 支持
变量作用域每个 case 独立整个 switch 共享整个 switch 共享整个 switch 共享
default 位置任意位置通常最后通常最后通常最后
空 case✅ 允许(什么都不做)✅ 允许✅ 允许✅ 允许

更多推荐