流程控制是每一种编程语言不可缺少的重要组成部分,它能够控制代码的逻辑走向及执行次序。

GO语言中常用的流程控制有 ifforswitchgoto 是为了简化代码而生的一种扩展类型的流程控制。

if else(分支结构)

if条件基本写法

语法格式如下:

if 表达式1 {
    分支1
} else if 表达式2 {
    分支2
} else {
    分支3
}

说明:当表达1的结果为 true 时,执行分支1,否则执行表达式2,如果满足则执行分支2,否则执行分支3。

GO语言规定与 if 匹配的左括号 { 必须与 if和表达式 放在同一行,否则会报错的哦。同理,与 else 匹配的 { 也必须与 else 写在一行,else 也必须与上一个 ifelse if 右边的大括号在同一行。

来个小示例吧:

func ifDemo1() {
    age := 12
    if age > 60 {
        fmt.Println("老年人")
    } else if age >= 18 {
        fmt.Println("青壮年")
    } else {
        fmt.Println("未成年")
    }
    // 输出 未成年
}

if条件特殊写法

还有一种特殊的写法,先添加一个执行语句,再根据变量值进行判断,如下:

func ifDemo2() {
    if age := 22; age > 60 {
        fmt.Println("老年人")
    } else if age >= 18 {
        fmt.Println("青壮年")
    } else {
        fmt.Println("未成年")
    }
    // 输出 青壮年,注意:此时的age变量只在if条件语句中生效
}

for(循环结构)

GO语言中的所有循环类型均可以使用 for 关键字来完成。

语法格式:

for 初始语句; 条件表达式; 结束语句 {
    循环体语句
}

来个九九乘法表小示例:

package main

import "fmt"

func main() {
    for i := 1; i <= 9; i++ {
        for j := 1; j <= i; j++ {
            fmt.Printf("%d * %d = %d \t", j, i, i*j)
        }
        fmt.Println()
    }
}

九九乘决小示例

无限循环

for {
    循环体语句
}

for 循环可以通过 breakgotoreturnpanic 语句强制退出循环。

for range

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

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

switch case

switch 语句可方便地对大量的值进行条件判断,可以当作是 if else 的一种简写方式:

比如:

package main

import "fmt"

func main() {
    finger := 3
    switch finger {
    case 1:
        fmt.Println("大拇指")
    case 2:
        fmt.Println("食指")
    case 3:
        fmt.Println("中指")
    case 4:
        fmt.Println("无名指")
    case 5:
        fmt.Println("小拇指")
    default:
        fmt.Println("无效的输入!")
    }
    // 输出 中指
}

拓展:

  • GO语言switch和PHP中的不同,不需要使用break跳出。
  • 一个分支有多个值时,可以使用英文逗号分隔。
  • 分支还可以使用表达,此时 switch 语句后不需要跟判断变量。
  • 只能有一个 default 分支,这个就不用多说了吧~

goto(跳转到指定标签)

goto 语句通过标签进行代码间的无条件跳转。示例如下:

func gotoDemo() {
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if j == 2 {
                // 设置退出标签
                goto breakTag
            }
            fmt.Printf("%v-%v\n", i, j)
        }
    }
    return
    // 标签
breakTag:
    fmt.Println("结束for循环")
}
还有 break(跳出循环)、continue(继续下次循环)没什么特别之处在这里就不多说了。