0Pricing
Go Academy · 课时

Go 中的 switch 语句

带标签和不带标签的 switch,以及 fallthrough

Go 中的 switch 语句 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

switch 基础

Go 的 switch 比 C 中的更强大:默认不会贯穿执行,并且一个 case 可以包含多个值:

day := "Monday"
switch day {
case "Saturday", "Sunday":
    fmt.Println("Weekend")
default:
    fmt.Println("Weekday")
}

不会隐式贯穿执行

在 Go 中,每个 case 的代码体都会自动结束——不同于必须显式编写 break 的 C:

  • 代码更简洁,错误更少
  • 只有需要类似 C 的行为时,才显式使用 fallthrough(很少需要)

带初始化语句的 switch

与 if 一样,switch 也接受可选的初始化语句:

switch os := runtime.GOOS; os {
case "linux":
    fmt.Println("Linux")
case "darwin":
    fmt.Println("macOS")
default:
    fmt.Printf("Other: %s\n", os)
}

无标签 switch(if-else 链的替代方案)

无标签 switch 的关键字后没有表达式——每个 case 都会计算一个布尔值:

score := 75
switch {
case score >= 90:
    fmt.Println("A")
case score >= 80:
    fmt.Println("B")
case score >= 70:
    fmt.Println("C")
default:
    fmt.Println("F")
}

类型 switch

类型 switch 会检查接口值的动态类型:

func describe(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("int: %d\n", v)
    case string:
        fmt.Printf("string: %s\n", v)
    default:
        fmt.Printf("unknown: %T\n", v)
    }
}

fallthrough

使用 fallthrough 可以显式执行下一个 case 的代码体,而不论其条件如何(很少需要):

n := 1
switch n {
case 1:
    fmt.Println("one")
    fallthrough
case 2:
    fmt.Println("one or two")
}

每个 case 包含多个值

在同一个 case 中使用逗号分隔多个值:

func isVowel(c byte) bool {
    switch c {
    case 'a', 'e', 'i', 'o', 'u':
        return true
    }
    return false
}

switch 与 if-else

以下情况请使用 switch:

  • 将一个表达式与多个值进行比较
  • 需要使用类型 switch 进行接口分派
  • 相比一连串的 if-else,使用 switch 可提升可读性

当条件是不同的布尔表达式时,请使用 if-else。

switch 中的 break

要提前退出 switch,请使用 break。要从 switch 内部退出外层循环,请使用带标签的 break:

loop:
for {
    switch input() {
    case "quit":
        break loop  // exits the for loop
    }
}

默认情况

当没有其他 case 匹配时,会执行 default case。最佳实践如下:

  • 处理枚举时始终包含 default,以捕获意外值
  • 将其放在末尾,以提升可读性
  • 在类型 switch 中使用 default,以平稳处理不支持的类型

快速检查

在 Go 中,当 switch 的某个 case 匹配时会发生什么——执行会贯穿到后续 case 吗?

回顾:Go 中的 switch

Go 的 switch 简洁而强大:

  • 不会隐式贯穿执行——请显式使用 fallthrough
  • 使用初始化语句限定临时变量的作用域
  • 无标签 switch 可以替代 if-else 链
  • 使用类型 switch 进行接口分派
  • 使用逗号分隔,为每个 case 指定多个值

下一节:使用 break、continue 和标签控制循环。

常见问题解答

「Go 中的 switch 语句」课时是免费的吗?

是的 — 「Go 中的 switch 语句」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「Go 中的 switch 语句」这节课中我会学到什么?

带标签和不带标签的 switch,以及 fallthrough 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「Go 中的 switch 语句」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. if 语句与初始化表达式
  2. for 循环:全部模式
  3. Go 中的 switch 语句
  4. break、continue 与标签
← 返回 Go Academy