go:控制结构

1. if-else

  condition 不需要用 () 括起来;

  关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 } 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。

  只存在单个分支时:

// { 必须和 if 在同一行
if condition {
   // do something  
}

  存在两个分支时:

// { 必须和 if 在同一行
if condition {
   // do something  
} else {  // { 必须和 else 在同一行
   // do something  
}

   存在两个以上的分支时:

// { 必须和 if 在同一行
if condition {
   // do something  
} else if  condition2{  //  { 必须和 else if 在同一行
   // do something 
} else {  // { 必须和 else 在同一行
   // do something  
}

  存在较多的分支时,建议使用 swaitch 结构,这样可读性更好

1.1 if 包含一个初始化语句

  if 后跟一个初始化语句,然后跟分号 ' ; ',然后跟条件表达式

    if cc := 12;cc > 10 {
        fmt.Println("cc is > 10",cc)
    }

  通过函数返回值为初始化变量赋值

func controlIf(condition int)  {

    if cc := add(13);cc > 10 {
        fmt.Println("cc is > 13",cc)
    }
}

func add(i int)(result int)  {

    return i+1
}

2. swaitch

  相比于Java,switch 更加灵活,它可以接收任意形式的表达式,一般结构为

switch var {
    case var1:
            ...
    case var2:
            ...default:
            ...
}

  1. var、var1、var2 可以使同类型的任意值,或者最终结果为相同类型的表达式;

  2. switch 关键字必须和 { 在同一行;

  3. 当匹配到某个case分之后,执行完相应的代码后自动退出 switch 结构,不需要使用 break 来退出switch 结构;

  4. 执行完匹配的分支后,若要继续执行下面的分支,可以在匹配的分支后添加 fallthrough 关键字实现;

  5. var1、var2 这些变量可以替换为表达式;

// condition = 2
func controlSwitch(condition int)  {

    condition =2
    switch condition {
    // controlSwitch: 2
    case 1:
        fmt.Println("controlSwitch:",condition)
    case 2:
        fmt.Println("controlSwitch:",condition)
    default:
        fmt.Println("controlSwitch:",condition)
    }

    switch condition {
    /**
        fallthrough controlSwitch: 2
        fallthrough controlSwitch: 3
        fallthrough controlSwitch: default
     */
    case 2:
        fmt.Println("fallthrough controlSwitch:",2)
        fallthrough
    case 3:
        fmt.Println("fallthrough controlSwitch:",3)
        fallthrough
    default:
        fmt.Println("fallthrough controlSwitch:","default")
    }

    cc :=2
    switch condition/2 {
    // controlSwitch: cc/2
    case cc/2:
        fmt.Println("controlSwitch:","cc/2")
    case 2:
        fmt.Println("controlSwitch:",2)
    default:
        fmt.Println("controlSwitch:","default")
    }
}
View Code

3. for

3.1 基于计数器的迭代

func controlFor(condition int)  {
    for i :=0;i<condition ; i++  {
        fmt.Println("controlFor:",i)
    }
}

  变量 i 的生命周期在循环完成后就已经结束,下次循环时还可以继续使用变量i

3.2 基于条件判断的迭代

  类似于 while 循环

    var x = 5
    
    for x > 0{
        x--
    }

3.3 无限循环

  三种形式效果一样

    for {
        fmt.Println(123)
    }
    for ; ;  {
        fmt.Println(123)
    }
    for true  {
        fmt.Println(123)
    }

3.4 for-range

  类似于 Java 的 foreach,但是该结构可以直接获取到当前遍历元素的下标,并且不用显示指定 遍历元素的类型

    var array [5]int
    for key, value := range array {
        fmt.Println(key,value)
    }
/**
    输出
      0 0
      1 0
      2 0
      3 0
      4 0
 */

4. break、continue

4.1 break

  一个 break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)。但在 switch 或 select 语句中,break 语句的作用结果是跳过整个代码块,执行后续的代码。

4.2 continue

  continue 忽略剩余的循环体而直接进入下一次循环的过程,但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件

原文地址:https://www.cnblogs.com/virgosnail/p/12918471.html