美文网首页
Go语言 流程控制

Go语言 流程控制

作者: 小杰的快乐时光 | 来源:发表于2018-08-18 22:31 被阅读0次

    Go语言支持以下几种流程控制语句
    条件语句:关键字为 if,else 和else if
    选择语句:关键字为switch,case和select(在channel中使用)
    循环语句:关键字为 for 和 range
    跳转语句:关键字 goto

    条件语句: if else 和 else if

    func main() {
       demo :=example(2)
       fmt.Println(demo)
    }
    
    func example( x int) int  {
       if x == 0 { //不需要将 x==0 括起来,左花括号必须与if在同一行,所有if中的花括号必须存在
          return 1
       }else {
          return x
       }
    }
    

    注:if语句允许在if里面声明变量,但是这个变量的作用域只在该条件逻辑块内。

    选择语句: 不用break结尾,go语言默认每个case最后都带有break

    func main() {
       var i string = "3"
       switch i {
       case "1":
          fmt.Println("这是1")
       case "2":
          fmt.Println("这是2")
       case "3":
          fallthrough //强制跳到下一个case,必须存在下一个case或者default,否则报错
       case "4":
          fmt.Println("这是4")
       }
    }
    

    上面的switch 后面的表达式不是必须的,因此上面的可以修改为:

    func main() {
       var i int = 3
       switch  {
       case i==1:
          fmt.Println("这是1")
       case i==2:
          fmt.Println("这是2")
       case i==3:
          fallthrough
       case i==4:
          fmt.Println("这是4")
       }
    }
    

    循环语句 :for 和range
    Go 只有一种循环结构——for 循环。

    func main() {
       nums := [10]int{1,2,3,4,5,6,7,8,9,10}
       for a,b:=range nums{ //这里的a只索引下标,b指索引下标对应的元素值
          fmt.Println(a,b)
       }
    }
    

    当没有指定循环条件时,将成为死循环

    for{
       fmt.Println()
    }
    

    goto,break,continue的使用与区别
    在Go语言的for循环中也支持使用break,continue来控制循环,break是跳出当前循环,continue是跳出本次循环。Go语言中break有个更为高级的功能:跳转到指定标签
    以下面这个代码为例

    func main() {
          for i:=0;i<5 ;i++  {
             fmt.Print("  ")
             fmt.Print(i," ")
             for j:=0;j<5 ;j++  {
                fmt.Print(j)
             }
          }
    }
    ----output----
      0 01234  1 01234  2 01234  3 01234  4 01234
    

    加入判断条件与break

    func main() {
          for i:=0;i<5 ;i++  {
             fmt.Print("  ")
             fmt.Print(i," ")
             for j:=0;j<5 ;j++  {
                fmt.Print(j)
                if j == 3 {
                   break
                }
             }
          }
    }
    ----output----
      0 0123  1 0123  2 0123  3 0123  4 0123
    

    再添加自定义loop标签,让break跳出到指定的标签,注:loop标签可以自定义,我这里标签名叫做loop,你可以命名为其他

    func main() {
       loop://自定义跳转标签  ①
          for i:=0;i<5 ;i++  {
             fmt.Print("  ")
             fmt.Print(i," ")  ②
             for j:=0;j<5 ;j++  {
                fmt.Print(j)
                if j == 3 {
                   break loop
                }
             }
          }
    }
    -----output-----
      0 0123
    

    经过上面的测试,我们可以看出:
    ①未使用loop标签时,break是跳出当前循环
    ②使用loop标签后,break就会终止loop处的外层循环
    ③loop标签不能使用在break之后,若放在break之前,loop必须是跟break连接成一个整的循环,比如放在代码中的①或②处都可以。

    break与continue是配合for使用的,但goto的使用不限于for,通常与条件语句配合使用。
    比如下面这个代码中,当for循环到i=3时,跳转到loop标签输出

    func main() {
       for i:=0;i<5 ;i++  {
          fmt.Println(i)
          if i == 3 {
             goto loop //跳转带 loop 标签处
          }
       }
       loop:
          fmt.Println("loop 标签")
    }
    -----output-----
    0
    1
    2
    3
    loop 标签
    

    当loop标签在for循环前面时,这时候 goto跳转到 loop标签就会形成死循环

    func main() {
    loop: // 这里就会形成死循环
       fmt.Println("loop 标签")
       for i:=0;i<5 ;i++  {
          fmt.Println(i)
          if i == 3 {
             goto loop //跳转到 loop标签
          }
       }
    }
    

    除了for循环外,其他的使用goto的场景

    func main() {
       a := 3
       fmt.Println(a+1)
       goto loop
       fmt.Println(a+2)
    loop:
       fmt.Println("loop 标签")
    }
    -----output-----
    4
    loop 标签
    

    根据上面的测试,我们可以看出:
    ①goto的使用不限于for,通常与条件语句配合使用,可以实现满足某条件后跳出循环体到指定的地方继续执行。
    ②goto语句可以无条件的进行跳转到指定行。
    ③goto跳转的标签既可以定义在for循环前面,也可以定义在for循环后面。在for前面时就有可能形成死循环,在for循环后面就会执行标签下面的代码。
    ④一般情况下,不推荐使用goto语句,很容易造成代码流程混乱。

    参考文章:https://blog.csdn.net/mofiu/article/details/77318376

    相关文章

      网友评论

          本文标题:Go语言 流程控制

          本文链接:https://www.haomeiwen.com/subject/fbdqiftx.html