阅读 224

Go语言入门之流程控制----练气三层|🏆 掘金技术征文|双节特别篇

1 流程控制之if else

一般写法

if 表达式1 {
    分支1
} else if 表达式2 {
    分支2
} else{
    分支3
}
复制代码

实例

package main

import "fmt"

/** 分支结构
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-29 00:00:39
  @version 1.0
   */
func main() {
   a, b, c := 1, 2, 3
   if a >b {
      fmt.Println(a)
   } else {
      fmt.Println(c)
   }
}
复制代码

if else的特殊写法

if条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断

实例

package main

import "fmt"

/** if else的特殊写法
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-29 00:00:39
  @version 1.0
   */
func main() {
   if a := 3; a > 0 {
      fmt.Println(a)
   }
}
复制代码

注意: Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个ifelse if右边的大括号在同一行。

2 流程控制之switch

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
复制代码

实例

package main

import "fmt"

/** switch语句
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-29 00:00:39
  @version 1.0
   */
func main() {

   switchTest(1)

}

func switchTest(a int)  {
   switch a {
   case 1:
      fmt.Println(1)
   case 2:
      fmt.Println(2)
   default:
      fmt.Println(a)

   }

}
复制代码

注意

  1. switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一匹配,直到匹配对为止。
  2. switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break

type switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。

switch x.(type){
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}
复制代码

实例

package main

import "fmt"

/** type switch
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-29 00:00:39
  @version 1.0
   */
func main() {

   switchTest("")

}

func switchTest( a interface{}  )  {
   switch a.(type) {
   case int:
      fmt.Println(1)
   case float32:
      fmt.Println(2)
   default:
      fmt.Println("未知的类型")

   }

}
复制代码

3 流程控制之 for循环

写法一

for init; condition; post { }
复制代码

说明:

  • init: 一般为赋值表达式,给控制变量赋初值;
  • condition: 关系表达式或逻辑表达式,循环控制条件;
  • post: 一般为赋值表达式,给控制变量增量或减量。

实例

package main

import "fmt"

/**for 循环演示
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 11:30:57
  @version 1.0
   */
func main() {
   forDemo(10)
}


func forDemo(y int) {
   for x := 0; x < y; x++ {
      fmt.Println("Hello World", x)
   }
}
复制代码

输出

Hello World 0
Hello World 1
Hello World 2
Hello World 3
Hello World 4
Hello World 5
Hello World 6
Hello World 7
Hello World 8
Hello World 9
复制代码

写法二

for condition { }
复制代码

实例

package main

import (
   "fmt"
)

/**for 循环演示
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 11:30:57
  @version 1.0
   */
func main() {
   forDemo1()

}

func forDemo1() {
   y := 0
   for ; y < 10; y++ {
      fmt.Println("Ferrayman",y)
   }
}
复制代码

输出

Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 3
Ferrayman 4
Ferrayman 5
Ferrayman 6
Ferrayman 7
Ferrayman 8
Ferrayman 9
复制代码

写法三

实例

package main

import (
   "fmt"
)

/**for 循环演示
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 11:30:57
  @version 1.0
   */
func main() {

   forDemo2()
}

func forDemo2() {
   x := 10
   for x > 0 {
      fmt.Println("Ferrayman", x)
      x--
   }
}
复制代码

输出

Ferrayman 10
Ferrayman 9
Ferrayman 8
Ferrayman 7
Ferrayman 6
Ferrayman 5
Ferrayman 4
Ferrayman 3
Ferrayman 2
Ferrayman 1
复制代码

4 流程控制之for range

Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律:

  1. 数组、切片、字符串返回索引和值。
  2. map返回键和值。
  3. 通道(channel)只返回通道内的值。

这里先不展开细讲,以后学习到相关数据结构时再细说。

5 break跳出循环

break语句可以结束forswitchselect的代码块。

实例

package main

import (
    "fmt"
)

/**break关键字的使用
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 22:45:55
  @version 1.0
   */
func main() {

        for j := 5; j > 0; j-- {
            for i := 0; i < 5; i++ {
                if i == 3 {
                    break
                }
                fmt.Println("Ferrayman",i)

            }
        }

}

复制代码

输出

Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 0
Ferrayman 1
Ferrayman 2
复制代码

break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的forswitchselect的代码块上。

package main

import (
   "fmt"
)

/**break关键字的使用
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 22:45:55
  @version 1.0
   */
func main() {
   Tag:
      for j := 10; j > 0; j-- {
         for i := 0; i < 10; i++ {
            if i == 5 {
               break Tag
            }
            fmt.Println("Ferrayman",i)

         }
      }

}
复制代码

输出

Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 3
Ferrayman 4
复制代码

6 continue跳过本次循环,继续下一次循环

实例

package main

import "fmt"

/**continue关键字的使用
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 22:45:55
  @version 1.0
   */
func main() {
   for i := 0; i < 10; i++ {
      if i == 5 {
         continue
      }
      fmt.Println("Ferrayman",i)

   }
}
复制代码

输出

Ferrayman 0
Ferrayman 1
Ferrayman 2
Ferrayman 3
Ferrayman 4
Ferrayman 6
Ferrayman 7
Ferrayman 8
Ferrayman 9
复制代码

注意: continue仅限在for循环当中使用

6 goto关键字

Go 语言的 goto 语句可以无条件地转移到过程中指定的行。

不建议使用goto关键字。会让程序变得难以理解。

实例

package main

import (
    "fmt"
)

/**goto关键字的使用
  @author 赖柄沣 bingfengdev@aliyun.com
  @date 2020-09-30 22:45:55
  @version 1.0
   */
func main() {
Tag1:
    fmt.Println("haha,我又来了")
        for i := 0; i < 5; i++ {
                if i == 3 {
                    goto Tag
                }
                fmt.Println("Ferrayman",i)

            }
Tag:
    fmt.Println("hehe,我出来了")
    goto Tag1
}

复制代码

输出

hehe,我出来了
haha,我又来了
Ferrayman 0
Ferrayman 1
Ferrayman 2

死循环。。。
而且第一次打印在程序的23行
复制代码

(每次执行标签tag和tag1的执行顺序不太一样,个人感觉这应该和go语言对并行编程的设计有关)