Skip to content

Follow Controller

Go 语言的流程控制主要通过以下几种语句来实现:ifelseforswitchselect 等。这些语句帮助你根据条件、循环和选择不同的代码路径。

1. if 语句

if 语句用于根据条件执行不同的代码块。

基本语法

go
if condition {
    // 条件为 true 时执行的代码
}

示例

go
package main

import "fmt"

func main() {
    x := 10
    if x > 5 {
        fmt.Println("x 大于 5")
    }
}

if-else 语句

你可以使用 else 来处理条件为 false 时的代码。

go
if condition {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}

示例

go
package main

import "fmt"

func main() {
    x := 10
    if x > 5 {
        fmt.Println("x 大于 5")
    } else {
        fmt.Println("x 小于或等于 5")
    }
}

if-else if-else 语句

你可以使用多个 else if 来检查多个条件。

go
if condition1 {
    // 条件 1 为 true 时执行
} else if condition2 {
    // 条件 2 为 true 时执行
} else {
    // 所有条件都不为 true 时执行
}

示例

go
package main

import "fmt"

func main() {
    x := 10
    if x > 10 {
        fmt.Println("x 大于 10")
    } else if x == 10 {
        fmt.Println("x 等于 10")
    } else {
        fmt.Println("x 小于 10")
    }
}

2. for 循环

Go 中只有一种循环形式:for 循环。你可以用它来实现不同类型的循环。

基本语法

go
for init; condition; post {
    // 循环体
}

示例

go
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

无条件循环

你也可以省略条件和 post 部分,实现一个无限循环。

go
for {
    // 无限循环
}

示例

go
package main

import "fmt"

func main() {
    i := 0
    for {
        fmt.Println(i)
        i++
        if i >= 5 {
            break
        }
    }
}

range 循环

range 用来迭代数组、切片、映射等数据结构。

go
for index, value := range collection {
    // index 是索引,value 是对应的值
}

示例

go
package main

import "fmt"

func main() {
    arr := []int{1, 2, 3, 4, 5}
    for index, value := range arr {
        fmt.Printf("索引: %d, 值: %d\n", index, value)
    }
}

3. switch 语句

switch 语句用于根据表达式的值选择执行不同的分支。它是多个 if-else 语句的替代方案。

基本语法

go
switch expression {
case value1:
    // 如果 expression 等于 value1 执行的代码
case value2:
    // 如果 expression 等于 value2 执行的代码
default:
    // 如果没有匹配的 case,执行 default 语句(可选)
}

示例

go
package main

import "fmt"

func main() {
    day := 2
    switch day {
    case 1:
        fmt.Println("星期一")
    case 2:
        fmt.Println("星期二")
    case 3:
        fmt.Println("星期三")
    default:
        fmt.Println("其他天")
    }
}

不需要表达式

如果你只关心条件而不关心表达式的值,可以省略表达式,直接在各个 case 中使用条件。

go
switch {
case x > 0:
    fmt.Println("x 大于 0")
case x < 0:
    fmt.Println("x 小于 0")
default:
    fmt.Println("x 等于 0")
}

示例

go
package main

import "fmt"

func main() {
    x := -10
    switch {
    case x > 0:
        fmt.Println("x 大于 0")
    case x < 0:
        fmt.Println("x 小于 0")
    default:
        fmt.Println("x 等于 0")
    }
}

4. select 语句

select 用于多个 goroutine 之间的同步。它类似于 switch,但针对通道(channel)。

基本语法

go
select {
case <-ch1:
    // 如果 ch1 有值就执行这里的代码
case <-ch2:
    // 如果 ch2 有值就执行这里的代码
default:
    // 如果没有任何通道准备好就执行这里的代码(可选)
}

示例

go
package main

import "fmt"

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        ch1 <- "消息 1"
    }()
    
    go func() {
        ch2 <- "消息 2"
    }()

    select {
    case msg1 := <-ch1:
        fmt.Println("收到消息:", msg1)
    case msg2 := <-ch2:
        fmt.Println("收到消息:", msg2)
    }
}

5. defer 语句

defer 用于延迟执行一个函数直到外层函数返回时。常用于资源清理或关闭操作。

示例

go
package main

import "fmt"

func main() {
    defer fmt.Println("这是最后执行的语句")
    fmt.Println("这是先执行的语句")
}

输出:

这是先执行的语句
这是最后执行的语句

总结

  • if:条件判断。
  • for:循环控制。
  • switch:多分支选择控制。
  • select:用于 goroutine 的同步,通常与 channel 一起使用。
  • defer:延迟执行,通常用于清理资源。

这些是 Go 语言中的常见流程控制语句,帮助你根据不同的条件、数据结构和程序状态来控制程序的执行流程。