Skip to content

控制结构

条件语句

if-else语句

go
age := 18

if age >= 18 {
    fmt.Println("成年人")
} else {
    fmt.Println("未成年人")
}

if-else if-else语句

go
score := 85

if score >= 90 {
    fmt.Println("优秀")
} else if score >= 80 {
    fmt.Println("良好")
} else if score >= 60 {
    fmt.Println("及格")
} else {
    fmt.Println("不及格")
}

if语句带初始化

go
// 在if语句中声明变量,作用域仅限于if块
if err := doSomething(); err != nil {
    fmt.Println("发生错误:", err)
    return
}

循环语句

Go语言只有 for 循环,但可以模拟多种循环形式。

经典for循环

go
for i := 0; i < 5; i++ {
    fmt.Println("第", i+1, "次循环")
}

模拟while循环

go
j := 0
for j < 5 {
    fmt.Println("j =", j)
    j++
}

无限循环

go
for {
    // 会一直执行,需要break退出
    fmt.Println("无限循环")
    break
}

break和continue

go
// break - 跳出循环
for i := 0; i < 10; i++ {
    if i == 5 {
        break  // 当i等于5时退出循环
    }
    fmt.Println(i)
}

// continue - 跳过本次迭代
for i := 0; i < 5; i++ {
    if i == 2 {
        continue  // 跳过i等于2的情况
    }
    fmt.Println(i)
}

嵌套循环与标签

go
outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i == 1 && j == 1 {
            break outer  // 跳出外层循环
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

range循环

go
// 遍历数组/切片
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("索引: %d, 值: %d\n", index, value)
}

// 忽略索引
for _, value := range numbers {
    fmt.Println("值:", value)
}

// 忽略值
for index := range numbers {
    fmt.Println("索引:", index)
}

// 遍历字符串
str := "Go语言"
for index, char := range str {
    fmt.Printf("位置: %d, 字符: %c\n", index, char)
}

// 遍历map
scores := map[string]int{"数学": 95, "语文": 87}
for key, value := range scores {
    fmt.Printf("%s: %d\n", key, value)
}

switch语句

基本switch

go
day := 3

switch day {
case 1:
    fmt.Println("星期一")
case 2:
    fmt.Println("星期二")
case 3:
    fmt.Println("星期三")
case 4:
    fmt.Println("星期四")
case 5:
    fmt.Println("星期五")
default:
    fmt.Println("周末")
}

多值匹配

go
day := 6

switch day {
case 1, 2, 3, 4, 5:
    fmt.Println("工作日")
case 6, 7:
    fmt.Println("周末")
default:
    fmt.Println("无效的日期")
}

无表达式switch

go
score := 85

switch {
case score >= 90:
    fmt.Println("优秀")
case score >= 80:
    fmt.Println("良好")
case score >= 60:
    fmt.Println("及格")
default:
    fmt.Println("不及格")
}

fallthrough穿透

go
num := 1

switch num {
case 1:
    fmt.Println("一")
    fallthrough  // 继续执行下一个case
case 2:
    fmt.Println("二")
default:
    fmt.Println("其他")
}
// 输出: 一 二

带初始化的switch

go
switch score := calculateScore(); {
case score >= 90:
    fmt.Println("优秀")
case score >= 60:
    fmt.Println("及格")
default:
    fmt.Println("不及格")
}

goto语句

注意

goto 语句应谨慎使用,过度使用会导致代码难以理解。

go
func main() {
    i := 0
    
Start:
    if i < 5 {
        fmt.Println(i)
        i++
        goto Start
    }
    
    fmt.Println("结束")
}

完整示例

go
package main

import "fmt"

func main() {
    // 打印九九乘法表
    fmt.Println("九九乘法表:")
    for i := 1; i <= 9; i++ {
        for j := 1; j <= i; j++ {
            fmt.Printf("%d×%d=%d\t", j, i, i*j)
        }
        fmt.Println()
    }
    
    // 判断闰年
    year := 2024
    if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
        fmt.Printf("%d年是闰年\n", year)
    } else {
        fmt.Printf("%d年不是闰年\n", year)
    }
}