• 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 

     

  • 相关阅读:
    执行器模式设计和使用
    你知道怎么用Idea抽取方法、创建class吗?
    intellij构建多模块项目
    解决IDEA16闪退的问题
    TestNG参数化测试-数据提供程序 @DataProvider方式
    java第三节 面向对象(上)
    java第二节 基本数据类型
    memcache使用方法测试
    mysql Substr与char_length函数的应用
    《web与移动开发》征文活动
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/7712792.html
Copyright © 2020-2023  润新知