GO语言的进阶之路-流程控制

                   GO语言的进阶之路-流程控制

                                           作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。流程控制语句有三个作用,第一,选择(根据条件跳转到不同的执行序列); 第二,循环(根据条件反复执行某个序列)第三,跳转(据条件返回到某执行序列)。

一.流程控制语句类型

  Go语言支持如下的几种流程控制语句:

  1>.条件语句:关键字为if、else和else if。

  2>.选择语句:关键字为switch、case和select。

  3>.循环语句:关键字为for和range。

  4>.跳转语句:关键字为goto。

  在具体的应用场景中,为了满足更丰富的控制需求,Go语言还添加了如下关键字: break 、 continue 和 fallthrough 。

二.各个流程控制案例展示

1.条件语句

 a>.单分支结构

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 package main
 8 
 9 import "fmt"
10 
11 func main() {
12     Name := "yinzhengjie"
13     if Name == "yinzhengjie" {
14         fmt.Println("His Chinese name is 尹正杰")
15     }else {
16         fmt.Println("He is not yinzhengjie!")
17     }
18 }
19 
20 
21 
22 
23 #以上代码执行结果如下:
24 His Chinese name is 尹正杰

b>.多分支结构

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 package main
 8 
 9 import "fmt"
10 
11 func AcademicRecords(x int64)  {
12     if 100>=x && x>90 {                //可以定义一个条件。
13         fmt.Println("优秀!")
14     }else if 90>=x && x>80 {        //可以定义另一个条件。
15         fmt.Println("较优")
16     }else if  80>=x && x>70{        //也可以在定义一个条件,它不局限于定义两个条件。
17         fmt.Println("良好")
18     }else if 70>=x && x>60 {
19         fmt.Println("一般")
20     }else {
21         fmt.Println("你娃娃得努力啦!")
22     }
23 }
24 
25 func main() {
26     AcademicRecords(93)    //调用该函数
27     AcademicRecords(82)
28     AcademicRecords(79)
29     AcademicRecords(65)
30     AcademicRecords(32)
31 }
32 
33 
34 
35 #以上代码执行结果如下:
36 优秀!
37 较优
38 良好
39 一般
40 你娃娃得努力啦!

2.选择语句

 a>.switch姿势一

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func MyPrint(n int)  {
13     switch n {    //有没有发现他和shell的case语句很像
14     case 0:
15         fmt.Printf("这是第【%d】种情况,它输入的值为:%v
",n,"first")
16     case 1:
17         fmt.Printf("这是第【%d】种情况,它输入的值为:%v
",n,"Second")
18     case 2:
19         fallthrough    //表示跳过当前的case,直接执行下一个case。
20     case 3:
21         fmt.Printf("这是第【%d】种情况,它输入的值为:%v
",n,"fourth")
22     case 4, 5, 6:
23         fmt.Printf("这是第【%d】种情况,它输入的值为:%v
",n,"Fifth to seventh")
24     default:
25         fmt.Printf("这是第【%d】种情况,它输入的值为:%v
",n,"默认情况")
26     }
27 }
28 
29 func main() {
30     for i:=0;i<10 ;i++  {
31         MyPrint(i)    //接下来我们就需要去调用问你定义的函数啦。
32     }
33 }
34 
35 
36 
37 #以上代码执行结果如下:
38 这是第【0】种情况,它输入的值为:first
39 这是第【1】种情况,它输入的值为:Second
40 这是第【2】种情况,它输入的值为:fourth
41 这是第【3】种情况,它输入的值为:fourth
42 这是第【4】种情况,它输入的值为:Fifth to seventh
43 这是第【5】种情况,它输入的值为:Fifth to seventh
44 这是第【6】种情况,它输入的值为:Fifth to seventh
45 这是第【7】种情况,它输入的值为:默认情况
46 这是第【8】种情况,它输入的值为:默认情况
47 这是第【9】种情况,它输入的值为:默认情况

b>.switch姿势二

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func AcademicRecords(n int)  {
13     switch  {    //有没有发现他和shell的case语句很像
14     case 100>=n && n > 90:
15         fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】
",n,"优秀")
16     case 90>=n && n>80 :
17         fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】
",n,"良好")
18     case 80>=n && n>70:
19         fallthrough    //表示跳过当前的case,直接执行下一个case。
20     case 70>=n && n>60:
21         fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】
",n,"一般")
22     default:
23         fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】
",n,"你娃娃得努力啦!")
24     }
25 }
26 
27 func main() {
28     for i:=45;i<100 ;i=i+10  {   //为了看到实验效果,我这里定义的步长为10,一会我们会说到这个函数。
29         AcademicRecords(i)    
30     }
31 }
32 
33 
34 
35 
36 #以上代码执行结果如下:
37 你当前的分数是:【45】,获得的评价是【你娃娃得努力啦!】
38 你当前的分数是:【55】,获得的评价是【你娃娃得努力啦!】
39 你当前的分数是:【65】,获得的评价是【一般】
40 你当前的分数是:【75】,获得的评价是【一般】
41 你当前的分数是:【85】,获得的评价是【良好】
42 你当前的分数是:【95】,获得的评价是【优秀】

c>.channel的select语句

  其实select的语法格式和switch语法格式类似,只不过select是专用于channel的流程控制语句,属于特殊的流程控制语句,此处我们了解即可,感兴趣的小伙伴可以看我关于channel的笔记。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     ch1 := make (chan int, 100)     //定义名称为ch1的一个channel,其类型为int,其容量为100。
14     ch2 := make (chan string,50)     //定义名称为ch2的一个channel,其类型为string,其容量为50。
15     select {
16     case <-ch1:     //我们只是定义了一个channel,但是还没有往里面传值,因此,该ch1和下面的ch2都是空的。
17         fmt.Println("ch1 pop one  hundred element")
18     case <-ch2:
19         fmt.Println("ch2 pop one  hundred element")
20     default:        //由于上面两个channel都是空的,因此只会默认走这条语句
21         fmt.Println("default")
22     }
23 }
24 
25 
26 
27 
28 #以上代码执行结果如下:
29 default

3.循环语句

  在Golang语言中,只存在for循环语句,没有类似Python中的while循环,也没有shell中的until循环等等。

a>.for循环姿势一,普通循环;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     var StartNumber  int64
14     for StartNumber = 11;StartNumber < 100 ;StartNumber += 11  { //定义起始的数字是11,结束的条件是小于100,每次循环都得加11.
15         fmt.Println(StartNumber) //强每次循环都打印出来。
16     }
17 }
18 
19 
20 
21 #以上代码执行结果如下:
22 11
23 22
24 33
25 44
26 55
27 66
28 77
29 88
30 99

b>.for循环姿势二,模拟while循环;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import "fmt"
12 
13 var (
14     Sum int
15 )
16 
17 func main() {
18     Sum  = 1
19     for Sum < 100 {            //此处模拟的就是Python中的while循环,它其实是普通循环演变而来的。只不过我们只去啦普通循环的结束条件。
20         fmt.Println(Sum)
21         Sum += Sum
22     }
23     fmt.Println(Sum)
24 }
25 
26 
27 
28 #以上代码执行结果如下:
29 1
30 2
31 4
32 8
33 16
34 32
35 64
36 128

c>.for循环姿势三,数组循环;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12 )
13 
14 func main() {
15     dict := make(map[string]int)
16     NameList := []string{"尹正杰","饼干","Golang"}
17     IdList := []int{100,200,300}
18 
19     for id,name := range NameList{ //基于数组的方式循环。
20         dict[name] = IdList[id]
21     }
22     fmt.Println(dict)
23 
24     for k,v :=range dict{
25         fmt.Println(k,v)
26     }
27 }
28 
29 
30 
31 
32 #以上代码执行结果如下:
33 map[饼干:200 Golang:300 尹正杰:100]
34 Golang 300
35 尹正杰 100
36 饼干 200

d>.for循环姿势四,死循环;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "bufio"
13     "os"
14     "fmt"
15 )
16 
17 var   (
18     UserInput string
19     line string
20 )
21 func main()  {
22     f := bufio.NewReader(os.Stdin) //读取输入的内容
23     for { //以下的内容就是死循环了,但是可以用continue和break来控制循环。
24         fmt.Print("请输入一些字符串>")
25         line,_ = f.ReadString('
') //定义一行输入的内容分隔符。
26         if len(line) == 1 {
27             continue //如果用户输入的是一个空行就跳过本次循环,让用户继续输入。
28         }
29         fmt.Sscan(line,&UserInput) //将从系统标准输入读取的内容按行(line)传给变量UserInput。
30         if UserInput == "stop" {
31             fmt.Println("程序已结终止!")
32             break        //当用户输入“stop”就跳出当前的for循环,从而使得整个程序结束。
33         }
34         fmt.Printf("您输入的参数是:·33[31;1m%v33[0m·
",UserInput)
35     }
36 }
37 
38 
39 
40 #以上代码执行结果如下:
41 请输入一些字符串>尹正杰
42 您输入的参数是:·尹正杰·
43 请输入一些字符串>ls
44 您输入的参数是:·ls·
45 请输入一些字符串>pwd
46 您输入的参数是:·pwd·
47 请输入一些字符串>stop
48 程序已结终止!

4.跳转语句

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func MyEcho() {
13     StartNumber := 0
14 Stop:
15     fmt.Println(StartNumber)
16     StartNumber += 100
17     if StartNumber < 500 {
18         goto Stop    //表示当代码执行到这一行时,跳转到关键字“Stop”这行代码上去。这个“Stop”关键字其实你可以随意定义哟!
19     }
20 }
21 
22 func main()  {
23     MyEcho()
24 }
25 
26 
27 
28 
29 
30 #以上代码执行结果如下:
31 0
32 100
33 200
34 300
35 400

三.小时牛刀

1.编写九九乘法表

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     for i := 1; i < 10; i++ {
 7         for j := 1; j <= i; j++ {
 8             fmt.Printf("%d x %d = %-2d ",i,j,i*j)
 9         }
10         fmt.Println()
11     }
12 }
13 
14 
15 
16 
17 
18 #以上代码执行结果如下:
19 1 x 1 = 1  
20 2 x 1 = 2  2 x 2 = 4  
21 3 x 1 = 3  3 x 2 = 6  3 x 3 = 9  
22 4 x 1 = 4  4 x 2 = 8  4 x 3 = 12 4 x 4 = 16 
23 5 x 1 = 5  5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 
24 6 x 1 = 6  6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 
25 7 x 1 = 7  7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 
26 8 x 1 = 8  8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 
27 9 x 1 = 9  9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81 

 

原文地址:https://www.cnblogs.com/yinzhengjie/p/7712792.html