一文熟悉 Go 的分支结构(if - else-if - else、switch)

简介: 我是陈明勇,本文分享的知识是 Go 的分支结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

耐心和持久胜过激烈和狂热。

我是陈明勇,本文分享的知识是 Go 的分支结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

分支结构

分支结构是结构化程序设计中的基础。针对分支结构,Go 提供了两种语句形式,一种是 if,另一种是 switch

if

if 语句是 Go 中最常用、最简单的分支控制结构,它分为单分支、双分支以及多分支三种用法。if 语句会根据布尔变量或布尔表达式,在两个或多个分支中选择一个执行。以下为 if 语句的形式:

if bool_condition {
  // 新分支
}
// 原分支
复制代码

如果布尔变量或布尔表达式为 true ,则进入新分支执行,否则会继续按照原分支的代码去执行。

单分支 if

1.png

单分支的用法,如果布尔表达式成立,则执行新分支的代码,然后继续执行原分支的代码,否则执行原分支的代码,下面是代码示例:

import "fmt"
func main() {
  num := 3
  if num > 2 {
    fmt.Println("num 大于 2")
  }
  fmt.Println("原分支代码")
}
复制代码

打印结果

num 大于 2
原分支代码
复制代码

因为 num > 2 因此,程序运行之后,会执行新分支的打印语句以及原分支的打印语句。除了单个布尔表达式以外,还可以加入 &&|| 条件运算符进行条件的组合,例如:

import "fmt"
func main() {
  num := 3
  if num > 2 && num < 10 {
    fmt.Println("num 大于 2 并且 num 小于 10")
  }
  fmt.Println("原分支代码")
}
复制代码

双分支 if-else

2.png

双分支结构,if 配合 else 关键字实现。如果表达式为 true,执行 分支1,否则执行 分支2,然后继续执行 原分支。下面是代码示例:

import "fmt"
func main() {
  age := 18
  if age == 18 {
    fmt.Println("您已满18岁")
  } else {
    fmt.Println("您未满18岁")
  }
  fmt.Println("原分支代码")
}
复制代码

执行结果:

您已满18岁
原分支代码
复制代码

age 的值为 18,因此会执行第一个分支的里打印语句,然后继续执行原分支的打印语句。

多分支 if - else if - else

3.png

多分支需要在 ifelse 的形式上,加上 else if 进行实现。如果 if 后面的布尔表达式不成立,则会判断 else if 后面的布尔表达式,然后进行分支的选择,下面是代码示例:

import "fmt"
func main() {
  name := "小明"
  if name == "小红" {
    fmt.Println("您好,小红!")
  } else if name == "小明" {
    fmt.Println("您好,小明!")
  } else {
    fmt.Println("您好,陌生人!")
  }
  fmt.Println("原分支代码")
}
复制代码

执行结果:

您好,小明!
原分支代码
复制代码

程序根据布尔表达式条件的值,选择了第二个分支去执行代码。

在 if 语句中声明变量

if 语句中,布尔表达式之前声明变量是 Go 语言的惯用法,这种使用方式可以提高代码的可读性。由于是在 if 语句中声明的变量,因此变量的作用域也只在 if 语句中,外部无法访问这些变量。下面是示例:

import "fmt"
func main() {
  mp := map[string]string{"name": "cmy"}
  if name, ok := mp["name"]; ok {
    fmt.Printf("存在 key → name:%s\n", name)
  } else {
    fmt.Println("key 不存在")
  }
  fmt.Println("原分支代码")
}
复制代码

if 语句中定义 name,ok 变量,使用 ok 判断 key 是否存在,如果存在则执行分支里的代码。

switch

基本用法:

switch T {
case value1:
  // 分支 1
case value2, value3, ...:
  // 分支 2
...
default:
  // 默认分支
}
复制代码

T 可以是常量、变量和布尔表达式等,case 关键字后面的 value 类型,必须与 T 的类型是一致的,且 value 是唯一的。Go 会根据 T 的值与各个 case 后面的 value 进行匹配,匹配成功则执行对应 case 分支,case 后面可以有多个 value。default 为默认分支,可有可无,如果前面的 case 都没匹配上,则会执行 default 分支。

示例

import "fmt"
func main() {
  name := "小明"
  if name == "小红" {
    fmt.Println("您好,小红!")
  } else if name == "小明" {
    fmt.Println("您好,小明!")
  } else {
    fmt.Println("您好,陌生人!")
  }
  fmt.Println("原分支代码")
}
复制代码

上面的代码,可以使用 switch 分支改造:

import "fmt"
func main() {
  name := "小明"
  switch name {
  case "小明":
    fmt.Println("您好,小明!")
  case "小红":
    fmt.Println("您好,小红!")
  default:
    fmt.Println("您好,陌生人!")
  }
  fmt.Println("原分支代码")
}
复制代码

执行结果:

您好,小明!
原分支代码
复制代码

name 等于 小明,与第一个 case 分支匹配成功,执行这个分支的代码,然后继续执行原分支的代码。

switch 分支当 if 分支使用

switch 分支后面不带常量、变量或布尔表达式等时,其效果与 if 分支类似。

import "fmt"
func main() {
  switch {
  case 1+1 != 2:
    fmt.Println("1 + 1 不等于 2")
  case 1+1 == 2:
    fmt.Println("1 + 1 等于 2")
  default:
    fmt.Println("0")
  }
  fmt.Println("原分支代码")
}
复制代码

switch 后面什么都没有时,程序会根据 case 后面布尔表达式的值进行分支的选择。

在 switch 语句中声明变量

if 一样,我们也可以在 switch 语句中声明变量,变量的作用域也只在 swtich 语句中,外部无法访问这些变量。

import "fmt"
func main() {
  mp := map[string]string{"name": "cmy"}
  switch name := mp["name"]; name {
  case "cmy":
    fmt.Println("cmy")
  case "kk":
    fmt.Println("kk")
  default:
    fmt.Println("unknown")
  }
  fmt.Println("原分支代码")
}
复制代码

fallthrough

Go 语言中,不同于其他语言,switch 块内,每个 case 无需声明 break 来终止。如果我们想执行多个 case 分支,可以使用 fallthrough 关键字来实现。

import "fmt"
func main() {
  mp := map[string]string{"name": "cmy"}
  switch name := mp["name"]; name {
  case "cmy":
    fmt.Println("cmy")
    fallthrough
  case "kk":
    fmt.Println("kk")
  default:
    fmt.Println("unknown")
  }
  fmt.Println("原分支代码")
}
复制代码

执行结果:

cmy
kk
原分支代码
复制代码

在第一个 case 分支后面使用了 fallthrough,不论下一个 case 是否与 cmy 匹配,都会执行这个分支的代码。

小结

本文对两种分支结构(ifswitch)进行了介绍,也举例说明了一些特殊的用法。如果代码存在着复杂的 if 多分支结构,不妨用 swtich 进行改造,也许代码的可读性会更高。


作者:陈明勇

链接:https://juejin.cn/post/7170354551483007006

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
7月前
|
安全 Go
Go语言封装艺术:代码安全与结构清晰
Go语言封装艺术:代码安全与结构清晰
39 0
|
13天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
17 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
14天前
|
程序员 Go API
【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解
|
18天前
|
自然语言处理 数据挖掘 程序员
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(下)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
26 1
|
18天前
|
数据采集 搜索推荐 Go
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)
26 1
|
7月前
|
Go 开发者
Go 语言怎么优化重复的 if err != nil 样板代码?
Go 语言怎么优化重复的 if err != nil 样板代码?
52 0
|
3月前
|
自然语言处理 IDE Go
高效Go编程之格式化+代码注释+命名+分号+控制结构
【2月更文挑战第6天】高效Go编程之格式化+代码注释+命名+分号+控制结构
36 0
|
3月前
|
程序员 Go 开发者
Go语言中的跳转控制结构:`goto`、`break` 和 `continue`
【2月更文挑战第3天】在Go语言中,跳转控制结构允许程序员直接控制程序的执行流程,通过`goto`、`break`和`continue`关键字实现代码的跳转、退出循环或跳过循环的某次迭代。本文将深入探讨这些跳转控制结构的使用场景、注意事项以及最佳实践,帮助读者更好地理解和应用Go语言中的跳转控制结构。
|
3月前
|
Go 开发者 索引
Go语言中的循环控制结构解析
【2月更文挑战第3天】本文将详细探讨Go语言中的循环控制结构,包括`for`循环、`range`循环以及`无限循环`的使用方法和适用场景。通过掌握这些循环结构,Go语言开发者能够更加高效地进行迭代操作、处理集合数据以及实现复杂的控制逻辑。
|
3月前
|
Go
Go语言中的条件控制结构详解
【2月更文挑战第3天】本文深入探讨了Go语言中的条件控制结构,包括`if`语句、`switch`语句以及它们的特点、使用场景和最佳实践。通过理解这些结构,读者可以更好地掌握Go语言中的条件判断和流程控制,从而编写出高效、清晰和可维护的代码。