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


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

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

    分支结构

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

    if

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

    if bool_condition {
    	// 新分支
    }
    // 原分支
    
    • 1
    • 2
    • 3
    • 4

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

    单分支 if

    在这里插入图片描述
    单分支的用法,如果布尔表达式成立,则执行新分支的代码,然后继续执行原分支的代码,否则执行原分支的代码,下面是代码示例:

    import "fmt"
    
    func main() {
    	num := 3
    	if num > 2 {
    		fmt.Println("num 大于 2")
    	}
    	fmt.Println("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    打印结果

    num 大于 2
    原分支代码
    
    • 1
    • 2

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

    import "fmt"
    
    func main() {
    	num := 3
    	if num > 2 && num < 10 {
    		fmt.Println("num 大于 2 并且 num 小于 10")
    	}
    	fmt.Println("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    双分支 if-else

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

    import "fmt"
    
    func main() {
    	age := 18
    	if age == 18 {
    		fmt.Println("您已满18岁")
    	} else {
    		fmt.Println("您未满18岁")
    	}
    	fmt.Println("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    执行结果:

    您已满18岁
    原分支代码
    
    • 1
    • 2

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

    多分支 if - else if - else

    在这里插入图片描述
    多分支需要在 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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    执行结果:

    您好,小明!
    原分支代码
    
    • 1
    • 2

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

    在 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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    switch

    基本用法:

    switch T {
    case value1:
    	// 分支 1
    case value2, value3, ...:
    	// 分支 2
    ...
    default:
    	// 默认分支
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    import "fmt"
    
    func main() {
    	name := "小明"
    	switch name {
    	case "小明":
    		fmt.Println("您好,小明!")
    	case "小红":
    		fmt.Println("您好,小红!")
    	default:
    		fmt.Println("您好,陌生人!")
    
    	}
    	fmt.Println("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行结果:

    您好,小明!
    原分支代码
    
    • 1
    • 2

    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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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("原分支代码")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行结果:

    cmy
    kk
    原分支代码
    
    • 1
    • 2
    • 3

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

    小结

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

  • 相关阅读:
    元数据管理系统
    300万数据导入导出优化方案,从80s优化到8s(实测)
    【python】任务调度编排工具 schedule | python定时任务工具
    Airflow用于ETL的四种基本运行模式, 2022-11-20
    数据结构 - 队列
    什么是分库分表-01
    设计模式:命令模式(C++实现)
    Thrift/RPC学习分享
    字符串——子串查找(kmp)
    剑指offer常见题 - 位运算问题(二)
  • 原文地址:https://blog.csdn.net/weixin_44604586/article/details/128056223