Skip to content

2.7、Golang 流程控制

  • 顺序执行
  • 选择执行
  • 循环执行

顺序执行

示例

go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("第一步")
	fmt.Println("第二步")
}

// 第一步
// 第二步

选择执行

if...else

语法

go
if 条件 {

} else{

}

// 多重判断
if 条件1 {

} else if 条件2 {

} else{

}


// 嵌套
if 条件1 {
	if 条件2 {

	}
}

示例

go
package main

import (
	"fmt"
)

func main() {
	a := 1

    // 布尔表达式不需要括号
	if a > 10 {
		fmt.Println("a  > 10")
	} else {
		fmt.Println("a  <= 10")
	}
	// a  <= 10
}

Golang 中的特殊写法

go
package main

import (
	"fmt"
)

func main() {

	// age处于局部作用域
	if age := 18; age > 18 {
		fmt.Println("age > 18")
	} else {
		fmt.Println("age <= 18")
	}
	// age <= 18
}

接收用户输入

go
package main

import (
    "fmt"
)

func main() {

    var age int

    fmt.Printf("请输入age:\n")
    fmt.Scan(&age)

    fmt.Printf("age: %v\n", age)

}

命令行方式运行

bash
$ go run main.go

请输入age:
23
age: 23

switch...case

语法

go
switch a {
	// 单值判断
	case 0:
		fmt.Println("a = 0")

	// 可以是多个值,逗号隔开
	case 1, 2, 3:
		fmt.Println("a = 1, 2, 3")

	// 表达式
	case a <= 10:
		fmt.Println("a > 10")

	// 向下执行
	case a > 10:
		fmt.Println("a > 10")
		fallthrough

	case a > 20:
		fmt.Println("a > 10")

	default:
		fmt.Println("default")
}

示例

go
package main

import (
	"fmt"
)

func main() {
	a := 1

	switch a {
	case 0:
		fmt.Println("a = 0")

	case 1:
		fmt.Println("a = 1")

	default:
		fmt.Println("default")
	}

	// a = 1
}

注意:不能使用 0 和非 0 表示真假

循环执行

for

语法

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

示例

go
package main

import (
	"fmt"
)

func main() {
	// for循环不加括号
	for i := 0; i < 5; i++ {
		fmt.Printf("%v ", i)
	}
	// 0 1 2 3 4

	// 初始条件写在for外边
	i := 0
	for ; i < 5; i++ {
		fmt.Printf("%v ", i)
	}

	// 只写判断条件
	i := 0
	for i < 5  {
		fmt.Printf("%v ", i)
		i++
	}

	// 永真循环
	for {

	}
}

for...range

for...range 遍历数组、切片、字符串、map 及通道(channel)

返回值:

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

示例

go
package main

import "fmt"

func main() {

	list := []int{1, 2, 3}

	for index, value := range list {
		fmt.Printf("%v=%v ", index, value)
	}
	// 0=1 1=2 2=3
}

遍历 map

go
package main

import "fmt"

func main() {
	m := make(map[string]string)
	m["name"] = "Tom"
	m["age"] = "28"

	for key, value := range m {
		fmt.Printf("%v=%v", key, value)
	}
	// name=Tomage=28
}

关键字

  • break
  • continue
  • goto

break

break 结束 for switch select 的代码块

break 注意事项

  • 单独在 select 中使用 break,和不使用 break 没区别
  • 单独在表达式 switch 语句,并且没有 falllthough,使用 break 和不使用 break 没区别
  • 单独在表达式 switch 语句,并且有 falllthough,使用 break 能够终止 fallthough 后面的 case 语句
  • 带标签的 break,可以跳出多层 select/switch 作用域,让 break 更加灵活,写法更加简单灵活,不需要使用控制变量一层一层跳出循环,没有带 break 的只能跳出当前语句块

示例

for

go
package main

import "fmt"

func main() {

    for i := 0; i < 10; i++ {
        if i >= 3 {
            break
        }
        fmt.Printf("%v\t", i)
    }
    // 0    1   2
}

switch

go
package main

import "fmt"

func main() {

    i := 1

    switch i {
    case 1:
        fmt.Println("1")
        fallthrough
    case 2:
        fmt.Println("2")
        // break
    case 3:
        fmt.Println("3")
        // break
    }
}

标签

go
package main

import "fmt"

func main() {

LABEL:
    for i := 0; i < 10; i++ {
        fmt.Printf("%v ", i)

        if i >= 3 {
            break LABEL
        }
    }

    fmt.Println("end")
}
// 0 1 2 3 end

continue

只能用在 for 循环,终止本次循环,进行下次循环

go
package main

import "fmt"

func main() {

    for i := 0; i < 10; i++ {

        if i%2 == 0 {
            continue
        } else {
            fmt.Printf("%v ", i)
        }
    }
    // 1 3 5 7 9
}

goto

通过标签进行代码之间的无条件跳转

go
package main

import "fmt"

func main() {

    goto LABEL
    fmt.Println("label")

LABEL:
    fmt.Println("end")
}
// end