• Go实战学习笔记-1.3流程控制


    1. 前言

    这里还是再总结一下流程控制,和其它语言相比做了一些优化,比如相比c增加了迭代器类型的for循环,switch针对c中容易出问题的地方做了一些修改,避免出现缺少break时存在的常见问题,此外,和Java类似也存在跳出循环和多层嵌套的方法,C中容易造成使用不当的goto也同样支持,在解决比较麻烦的go错误处理时goto有奇效,但基本上还是不太建议使用。
    本次总结的内容主要如下:

    在这里插入图片描述

    2. if分支

    if语句基本和C语言的if类似(由于Go的语法不需要括号以及使用分号换行,所以写起来是更加高效的):

    if xxx {
        xxx
    } else if {
        xxx
    } else if {
        xxx
    } else {
        xxx
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    示例:
    判断任意年份是否为闰年,需要满足以下条件中的任意一个:
    ① 该年份能被 4 整除同时不能被 100 整除;
    ② 该年份能被400整除。

    package main
    
    import "fmt"
    
    func main() {
    	var a int
    	fmt.Println("请输入年份:")
    	fmt.Scan(&a)
    	if a % 400 == 0 {
    		fmt.Println("该年是闰年")
    	} else if (a % 4 == 0) && (a % 100 != 0) {
    		fmt.Println("该年是闰年")
    	} else {
    		fmt.Println("该年不是闰年")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果:

    在这里插入图片描述

    3. for及for-range循环

    除了传统的for循环,目前较新的语言都是支持迭代器方式的for循环的,go也不例外,通过range关键词来迭代获取对应的key、value值进行迭代进行循环。
    示例:

    package main
    
    import "fmt"
    
    func main() {
    	var i int
    	sum := 0
    	for i = 0; i < 100; i++ {
    		sum+=i
    	}
    	fmt.Println(sum)
    
    	arr := [...]int{1,2,3,4,5}
    	for k,v := range arr {
    		fmt.Println(k, v)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果:

    在这里插入图片描述

    4. switch-case-fallthrough分支

    在C中switch-case之后跳出某个分支是需要break的,新手往往会忘记break从而引起bug,因此在Go中去掉了分支结束需要break跳出的方式,case分支结束后就自动跳出该分支了;对于某些特殊需求比如多个case分支共用一个执行语句或这个分支结束后想继续执行下一个分支,那么使用fallthrough来避免执行后跳出对应的case分支,当然,这种方式是不提倡的。
    示例:

    package main
    
    import "fmt"
    
    func main() {
    	var a int
    	fmt.Println("请输入1-7:")
    	fmt.Scan(&a)
    	switch a {
    	case 1:
    		fmt.Println("星期一")
    	case 2:
    		fmt.Println("星期二")
    	case 3:
    		fmt.Println("星期三")
    	case 4:
    		fmt.Println("星期四")
    	case 5:
    		fmt.Println("星期五")
    	case 6:
    		fmt.Println("星期六")
    	case 7:
    		fmt.Println("星期天")
    	default:
    		fmt.Println("未知")
    	}
    
    	//fallthrough
    	switch a {
    	case 1:
    		fmt.Println("星期一")
    	case 2:
    		fmt.Println("星期二")
    	case 3:
    		fmt.Println("星期三")
    	case 4:
    		fmt.Println("星期四")
    	case 5:
    		fmt.Println("星期五")
    	case 6:
    		fmt.Println("星期六")
    		fallthrough
    	case 7:
    		fmt.Println("周末")
    	default:
    		fmt.Println("未知")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    结果:

    在这里插入图片描述

    5. goto

    goto语句我觉得处理错误时比较好用,因为没有抛出异常,很可能会出现很多判断err的情况,这种的可以使用goto统一处理,但是怎么说那,goto语句这种跳转还是会造成一定的风险,基本上还是不太建议使用。
    示例:

    package main
    
    import "fmt"
    
    func main() {
    	var a int
    	fmt.Println("请输入1-7:")
    	_, err := fmt.Scan(&a)
    	if err != nil {
    		goto errTodo
    	}
    
    	_, err = fmt.Println(a)
    	if err != nil {
    		goto errTodo
    	}
    
    errTodo:
    	fmt.Println("错误处理")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    结果:

    在这里插入图片描述

    6. break和continue

    由于go没有while循环,一般是使用for循环来代替的,要跳出循环或者逻辑判断后直接进行下一次循环的话还是需要breakcontinue
    示例:

    package main
    
    import "fmt"
    
    func main() {
    	for {
    		var a int
    		fmt.Println("请输入1-7:")
    		_, err := fmt.Scan(&a)
    		if err != nil {
    			fmt.Println(err)
    			continue
    		}
    
    		if (a < 1) || (a > 7) {
    			fmt.Println("非法的输入")
    			continue
    		}
    
    		if (a >= 1) && (a <= 7) {
    			fmt.Println("输入正确:", a)
    			break
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    结果:

    在这里插入图片描述

    7. 跳出嵌套循环

    对于嵌套循环,我们有时候需要跳出外层循环,这时go也是借助于类似Java等的命名空间的方式break跳出嵌套循环。
    示例:

    package main
    
    import "fmt"
    
    func main() {
    	first:for i := 0; i < 5; i++ {
    		for j := 0; j < 5; j++ {
    			fmt.Println(i * j)
    			if i * j == 4 {
    				break first
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果(可以试一下不加first只有break的话会跳出到哪里):

    在这里插入图片描述

    8. 最后

    基本上流程控制就这些了,相较于C,go去除了while循环,for循环完全是足够的,增加了for range这种迭代方式的循环,此外,switch上也去除了容易犯错的必须加break的地方,对于有特殊需求的也增加了fallghrough来处理,嵌套循环跳出的方式和Java等是比较类似的。

  • 相关阅读:
    Kubernetes 基础
    视觉slam14讲 ——ch2实践部分
    Kafka:安装与简单使用
    mediasoup udp端口分配策略
    浅析三维模型3DTile格式轻量化处理常见问题与处理措施
    集成学习家族总结
    C#以太网简介
    ubuntu 20.04 访问csdn报错 Secure connection failed
    深度学习求解微分方程系列四:一种基于自适应激活函数的PINN求解方法—burger方程逆问题
    电力电子转战数字IC20220704day39——路科实验3c
  • 原文地址:https://blog.csdn.net/weixin_39510813/article/details/126592302