解释 Golang 中的 switch 语句

简介: 【8月更文挑战第31天】

在 Go 语言(Golang)中,switch 语句是处理多重条件分支的一个重要工具。与其他编程语言中的 switch 语句类似,Go 的 switch 语句用于根据表达式的值选择执行不同的代码块。Go 语言的 switch 语句具有简洁、高效和灵活的特点,使得编写条件判断逻辑变得更为简单。本文将详细介绍 Golang 中的 switch 语句,包括其基本用法、特点、进阶用法以及一些实际应用示例。

1. 基本语法

在 Go 语言中,switch 语句的基本语法如下:

switch expression {
   
case value1:
    // 执行语句块1
case value2:
    // 执行语句块2
default:
    // 执行默认语句块
}
  • expression:这是一个可选的表达式。如果省略 expressionswitch 语句将逐个测试每个 case 标签的布尔表达式。
  • case:用于匹配 expression 的值。如果 expression 的值与 case 中的值匹配,执行该 case 的代码块。
  • default:这是一个可选的部分,如果没有任何 case 匹配 expression 的值,则执行 default 代码块。

示例:

package main

import "fmt"

func main() {
   
    day := 3
    switch day {
   
    case 1:
        fmt.Println("Monday")
    case 2:
        fmt.Println("Tuesday")
    case 3:
        fmt.Println("Wednesday")
    case 4:
        fmt.Println("Thursday")
    case 5:
        fmt.Println("Friday")
    case 6:
        fmt.Println("Saturday")
    case 7:
        fmt.Println("Sunday")
    default:
        fmt.Println("Invalid day")
    }
}

在这个示例中,day 变量的值为 3,所以 switch 语句将打印 “Wednesday”。

2. 匹配多值

Go 的 switch 语句允许在一个 case 中列出多个值,使用逗号分隔。这在处理多个匹配条件时非常有用。

示例:

package main

import "fmt"

func main() {
   
    num := 2
    switch num {
   
    case 1, 3, 5, 7, 9:
        fmt.Println("Odd number")
    case 2, 4, 6, 8, 10:
        fmt.Println("Even number")
    default:
        fmt.Println("Not in range")
    }
}

在这个示例中,num 变量的值为 2,因此 switch 语句将打印 “Even number”。

3. switch 表达式和条件

Go 语言的 switch 语句可以省略 expression,在这种情况下,switch 语句将逐个测试每个 case 标签的布尔表达式。这使得 switch 可以用作多重条件判断。

示例:

package main

import "fmt"

func main() {
   
    num := 15
    switch {
   
    case num < 0:
        fmt.Println("Negative number")
    case num == 0:
        fmt.Println("Zero")
    case num > 0 && num < 10:
        fmt.Println("Single-digit positive number")
    case num >= 10:
        fmt.Println("Double-digit or larger number")
    }
}

在这个示例中,num 变量的值为 15,switch 语句将打印 “Double-digit or larger number”。

4. fallthrough 语句

在 Go 语言的 switch 语句中,每个 case 语句块默认是不自动“贯穿”到下一个 case 的。如果需要执行多个 case 的代码块,可以使用 fallthrough 语句显式地实现这一行为。fallthrough 语句使得当前 case 执行完后,继续执行下一个 case 的代码块。

示例:

package main

import "fmt"

func main() {
   
    num := 2
    switch num {
   
    case 1:
        fmt.Println("One")
        fallthrough
    case 2:
        fmt.Println("Two")
        fallthrough
    case 3:
        fmt.Println("Three")
    default:
        fmt.Println("Not 1, 2, or 3")
    }
}

在这个示例中,num 变量的值为 2,因此 switch 语句将打印 “Two” 和 “Three”。fallthrough 使得 case 2 执行完后,继续执行 case 3 的代码块。

5. 类型 switch

Go 的 switch 语句还支持类型 switch,用于根据变量的动态类型执行不同的代码块。这在处理接口类型和反射时非常有用。

示例:

package main

import "fmt"

func main() {
   
    var i interface{
   } = 42

    switch v := i.(type) {
   
    case int:
        fmt.Println("int:", v)
    case string:
        fmt.Println("string:", v)
    case bool:
        fmt.Println("bool:", v)
    default:
        fmt.Println("unknown type")
    }
}

在这个示例中,i 的实际类型是 int,所以 switch 语句将打印 “int: 42”。vswitch 语句中 case 的局部变量,用于存储匹配的类型值。

6. switchgoto

虽然 goto 语句在 Go 语言中是不常用的,但它可以与 switch 语句一起使用,通常用于实现跳转逻辑。

示例:

package main

import "fmt"

func main() {
   
    num := 2

    switch num {
   
    case 1:
        fmt.Println("One")
        goto End
    case 2:
        fmt.Println("Two")
        goto End
    default:
        fmt.Println("Default")
    }

End:
    fmt.Println("End of switch")
}

在这个示例中,goto End 语句使得在 case 2 后直接跳转到 End 标签,打印 “End of switch”。

7. 总结

Go 语言的 switch 语句提供了简洁而灵活的条件分支机制。通过 switch 语句,开发者可以高效地处理不同的条件情况,使代码更加易读和维护。Go 的 switch 支持多值匹配、条件判断、fallthrough 语句、类型 switch 等功能,为处理复杂逻辑提供了多样化的选择。尽管 goto 语句不常用,但在特定情况下与 switch 配合使用也能实现跳转逻辑。掌握 Go 的 switch 语句,有助于更好地编写高效、清晰的条件判断代码。

目录
相关文章
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
52 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
Go
golang的switch语句使用fallthrough
很多的教程在说明golang的switch时,都会特别指明,switch语句不会自动向下贯穿, 因此不必在每一个case子句的末尾都添加一个break语句,有些书本说明, 需要向下贯穿的时候, 显示调用fallthrough语句.对于有些人来说, 对于这句话的理解是: 当case语句匹配后, 显示调用fallthrough语句, 那么就会接着判断下一个case条件. 我之前就是这么理解的, 有些书也是这么理解, 并且这么举例的. 网上很多的教程, 也是错误的.《学习go语言》的p12:它不会匹配失败后自动向下尝试, 但是可以使用fallthrough 使其这样做。
2696 1
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
110 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
66 4
Golang语言文件操作快速入门篇
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
101 3
Golang语言之gRPC程序设计示例
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4
|
2月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
46 3
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
50 4
Golang语言goroutine协程篇
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
51 3
Golang语言之Prometheus的日志模块使用案例