Go中的switch的8种使用场景:没有你想的那么简单

简介: 在 Go 中灵活使用 switch,可以使代码更清晰、更易维护。 switch 是 Go 中不可或缺的控制结构之一

Go语言中,switch,是一个高度灵活,其功能强大的控制结构,相比较Java中的switch,更受到语言重视。
@TOC


它不仅可以替代多层 if-else,还能在更复杂的逻辑中灵活应用。下面详细讲解 switch 的深度用法,并结合示例展示如何充分发挥其功能。

1.基础用法

switch 的基础语法用来匹配单个变量的值:

package main

import "fmt"

func main(){
   
    x:=2
    switch x{
   
    case 1:
        fmt.println("x 等于 1");
    case 2:
        fmt.println("x 等于 2");
    case 3:
        fmt.println("x 等于 3");
    }
}

2.多值匹配

每个case分支可以匹配多个值,使用逗号分隔。

package main

import "fmt"

func main(){
   
    day:="Tuesday"
    switch day{
   
    case "Mondey","Tuesday","Wednesday":
        fmt.Println("这是工作日")
    case "Saturday","Sunday":
        fmt.Println("这是周末")
    default:
        fmt.Println("无效的天数")
    }

}

3.不指定表达式的 switch

Go中的switch可以省略表达式,直接用作条件分支判断,这类似于多层if-else

package main

import "fmt"

func main(){
   
    x:=1
    switch{
   
    case x > 0:
        fmt.Println("正数")
    case x < 0:
        fmt.Println("负数")
    default:
        fmt.Println("0")
    }
}

4. switch 的两种形态

形式一:表达式形态
switch v {
   
case condition1:
case condition2:
}
  • 特点
    • switch 后面带有一个表达式(如 v)。
    • 每个 case 的条件必须是一个具体值或与表达式可比较的值
    • 这种形式用于直接比较,如case 1, case 'a'等。
      形式二:无表达式形态
      switch {
             
      case condition1:
      case condition2!=11 && condition2 !=12:
      }
      
  • 特点
    • switch 后没有表达式。
    • 每个 case 是一个布尔条件表达式(即可以为 truefalse)。
    • 用于复杂的条件判断场景。

      5.使用 fallthrough 强制进入下一个分支

      默认情况下,swich在匹配到一个case后会退出。如果想继续执行下一个case,可以使用 fallthrough 关键字。
      ```go
      package main

import "fmt"

func main() {
switch x := 1; x {
case 1:
fmt.Println("x 是 1")
fallthrough
case 2:
fmt.Println("这行会执行,因为 fallthrough")
default:
fmt.Println("默认分支")
}
}

    注意:fallthrough 不会重新检查条件,仅执行下一个分支。
### 6.使用类型断言的 switch
`switch` 可以配合类型断言使用,用来处理接口的不同类型
```go
package main

import "fmt"

func main() {
    var i interface{} = 42 // i 可以是任意类型
    switch v := i.(type) {
    case int:
        fmt.Printf("i 是 int,值为 %d\n", v)
    case string:
        fmt.Printf("i 是 string,值为 %s\n", v)
    case bool:
        fmt.Printf("i 是 bool,值为 %t\n", v)
    default:
        fmt.Printf("未知类型: %T\n", v)
    }
}

7.嵌套 switch

switch 中嵌套另一个switch以实现更复杂的条件逻辑。

package main

import "fmt"

func main() {
   
    x := 10
    switch {
   
    case x > 0:
        fmt.Println("x 是正数")
        switch {
   
        case x%2 == 0:
            fmt.Println("x 是偶数")
        default:
            fmt.Println("x 是奇数")
        }
    case x < 0:
        fmt.Println("x 是负数")
    default:
        fmt.Println("x 是零")
    }
}

8. switch 用于优化复杂条件

当条件分支过多时,用 switch 可以避免冗长的 if-else 语句,提高代码可读性。

package main

import "fmt"

func main() {
   
    grade := 85
    switch {
   
    case grade >= 90:
        fmt.Println("优秀")
    case grade >= 75:
        fmt.Println("良好")
    case grade >= 60:
        fmt.Println("及格")
    default:
        fmt.Println("不及格")
    }
}

总结

通过灵活使用 switch,可以使代码更清晰、更易维护,是 Go 中不可或缺的控制结构之一。
  • 简单匹配:直接匹配变量值。
  • 多值匹配:每个 case 可以匹配多个值。
  • 条件判断:不指定表达式时,switch 等价于多层 if-else。
  • 类型判断:结合类型断言实现不同类型处理。
  • 灵活控制:使用 fallthrough 控制分支流转。

在结尾处,我就替大家回答一个疑惑。
Java 中 switch 不是不太支持使用吗?为什么在 Go 中却备受重视?

Go 的哲学:简单直接

  • Go语言倡导简单性与直接性,尽量避免复杂的继承和多态结构。
  • switch 被设计得功能很强大,适用于多种场景(值判断、逻辑分支、类型断言),因此在 Go 中更受重视。

Java 的哲学:面向对象优先

  • Java 是典型的面向对象语言,设计中更强调通过类和接口解决问题。
  • 对于复杂的条件判断,Java 倾向于使用多态或设计模式,switch 的使用场景相对有限。

希望大家收获,到此结束喽
( ̄︶ ̄)↗ 高抬贵手,一键三联。略略

目录
相关文章
|
5月前
|
算法
动态规划之完全背包
本文详解完全背包问题:作为动态规划经典题型,区别于01背包(每物限选1次),其特点是每种物品可无限次选取。文章从定义、状态转移方程(dp[i][j] = max(dp[i-1][j], dp[i][j-w]+v))、二维/一维实现到遍历顺序对组合数与排列数的影响,结合零钱兑换II、组合总和IV等5道典型例题深入剖析,助力掌握核心思想与编码技巧。
314 1
|
5月前
|
文字识别 NoSQL API
Go-Zero微服务实战:高并发场景下的学生认证系统设计与实现
在校园社交等垂直领域应用中,"学生身份认证"是构建信任体系的核心基石。本文将会基于 Go-Zero 微服务框架,详细拆解了一个生产级的学生认证系统实现。涵盖了 OCR 双通道故障转移、WebSocket 实时推送、事件驱动架构 (EDA)、敏感数据加密 以及 有限状态机(FSM) 的设计模式。
398 7
|
5月前
|
存储 缓存 安全
Go map 底层原理
虽然大家天天都在用 `map`,但很多人对它的理解只停在“查得快”“底层是哈希表”“桶里有 8 个槽位”这几句。或许跟别人吹牛的时候,还有几分用处;但真到线上排查延迟抖动、锁竞争、内存占用、热点键冲突,这点认识往往是不够的。
447 1
|
5月前
|
存储 缓存 安全
一文带你读懂 Go 1.24 map 重构了什么?
本文聚焦 Go 1.24 map 底层重构,解释它如何从旧版 bucket + overflow 方案,演进为 Swiss Table + 局部 split 的新结构,以及它所带来的性能提升。
364 1
一文带你读懂 Go 1.24 map 重构了什么?
|
5月前
|
算法 机器人 测试技术
动态规划入门详解
等待了好久好久,今天终于可以对动态规划动手了(☆▽☆)
263 3
|
5月前
|
缓存 安全 测试技术
GO项目开发规范文档解读
本篇博客的目的,更多是为快速翻阅与回忆使用。
309 1
|
5月前
|
存储 缓存 编译器
依赖管理(go mod)
上部分,我们介绍了使用GOPATH的痛点:多个项目无法共享同一个GOPATH,虽然vendor仍然无法多个项目无法共享同一个GOPATH,但是它提供了一种机制,让项目的依赖隔离而不互相干扰。版本格式 v(major).(minorr).(patch)中的 major 指的是大版本,minor 指的是小版本,patch 指的是补丁版本。从GOPATH到vendor,再到Go Module,这是一个不断演进的过程,了解每代依赖管理的痛点,能够更好的明白下一代依赖管理的初衷。
282 1
|
5月前
|
算法 自动驾驶 安全
【路径规划】在二维和三维空间中实现RRT_算法,根据障碍物位置和尺寸实现的避障功能附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍 一、路径规划与避障的重要性 在机器人运动控制、自动驾驶、无人机导航等众多领域,路径规划与避障是关键技术。例如,在工业机器人的操作场景中,机器人需要在复杂的工作空间内,从起始点运动到目标点,同时避开各种障碍物,如生产设备、固定支架等,以确保生产任务
295 0
|
5月前
|
编解码 自然语言处理 机器人
IEEE顶刊:水下机器人AUV路径规划和MPC模型预测控制跟踪控制(复现)
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍 一、水下机器人(AUV)概述 水下机器人(AUV)在海洋科学研究、资源勘探、水下工程等众多领域发挥着关键作用。例如,在深海矿产资源勘探中,AUV 能够深入到复杂的海底地形区域,获取详细的地质数据;在海洋生态环境监测方面,AUV 可以实时采集不同深
345 0
|
5月前
|
中间件 API Go
自go-zero走进微服务
Go-zero 的微服务进阶之路:始于 goctl 的契约驱动与提效,立于 zrpc 与 etcd 的架构互联,成于 熔断限流等全链路服务治理的坚实保障。
407 1