<返回目录     Powered by claud/xia兄

第3课: 控制流程

if条件语句

Go语言的if语句不需要括号,但必须有花括号。

基本if语句

package main

import "fmt"

func main() {
    age := 18

    if age >= 18 {
        fmt.Println("你已成年")
    }

    // if-else
    score := 85
    if score >= 60 {
        fmt.Println("及格")
    } else {
        fmt.Println("不及格")
    }
}

if-else if-else

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中初始化变量
if num := 10; num > 0 {
    fmt.Println("正数:", num)
} else if num < 0 {
    fmt.Println("负数:", num)
} else {
    fmt.Println("零")
}
// num在这里不可访问

// 实际应用:错误处理
if err := doSomething(); err != nil {
    fmt.Println("错误:", err)
    return
}

switch语句

Go的switch语句更加灵活,不需要break,自动终止。

基本switch

package main

import "fmt"

func main() {
    day := 3

    switch day {
    case 1:
        fmt.Println("星期一")
    case 2:
        fmt.Println("星期二")
    case 3:
        fmt.Println("星期三")
    case 4:
        fmt.Println("星期四")
    case 5:
        fmt.Println("星期五")
    case 6, 7:  // 多个条件
        fmt.Println("周末")
    default:
        fmt.Println("无效的日期")
    }
}

switch的初始化

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

无条件switch

// 相当于if-else链
hour := 14

switch {
case hour < 12:
    fmt.Println("上午")
case hour < 18:
    fmt.Println("下午")
default:
    fmt.Println("晚上")
}

fallthrough关键字

// fallthrough会继续执行下一个case
num := 2

switch num {
case 1:
    fmt.Println("一")
    fallthrough
case 2:
    fmt.Println("二")
    fallthrough
case 3:
    fmt.Println("三")
}
// 输出: 二 三

类型switch

func checkType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("整数: %d\n", v)
    case string:
        fmt.Printf("字符串: %s\n", v)
    case bool:
        fmt.Printf("布尔: %t\n", v)
    default:
        fmt.Printf("未知类型: %T\n", v)
    }
}

func main() {
    checkType(42)
    checkType("Hello")
    checkType(true)
    checkType(3.14)
}

for循环

Go语言只有for循环,没有while和do-while。

传统for循环

// 基本for循环
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// 多变量
for i, j := 0, 10; i < j; i, j = i+1, j-1 {
    fmt.Printf("i=%d, j=%d\n", i, j)
}

while风格的for循环

// 省略初始化和后置语句
count := 0
for count < 5 {
    fmt.Println(count)
    count++
}

无限循环

// 无限循环
for {
    fmt.Println("无限循环")
    break  // 需要break退出
}

// 实际应用:服务器循环
for {
    conn, err := listener.Accept()
    if err != nil {
        continue
    }
    go handleConnection(conn)
}

for-range循环

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

// 只要索引
for i := range nums {
    fmt.Println(i)
}

// 只要值(使用_忽略索引)
for _, v := range nums {
    fmt.Println(v)
}

// 遍历字符串
str := "Hello"
for i, ch := range str {
    fmt.Printf("%d: %c\n", i, ch)
}

// 遍历map
m := map[string]int{"a": 1, "b": 2, "c": 3}
for key, value := range m {
    fmt.Printf("%s: %d\n", key, value)
}

break和continue

break:跳出循环

// 跳出当前循环
for i := 0; i < 10; i++ {
    if i == 5 {
        break
    }
    fmt.Println(i)
}

// 跳出指定循环(标签)
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)
    }
}

continue:跳过本次循环

// 跳过偶数
for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue
    }
    fmt.Println(i)  // 只打印奇数
}

// 使用标签
outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if j == 1 {
            continue outer  // 继续外层循环
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

goto语句

Go支持goto,但应谨慎使用。

func main() {
    i := 0

loop:
    fmt.Println(i)
    i++
    if i < 5 {
        goto loop
    }

    fmt.Println("结束")
}

综合示例

示例1:猜数字游戏

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    target := rand.Intn(100) + 1
    attempts := 0

    fmt.Println("猜数字游戏(1-100)")

    for {
        attempts++
        var guess int
        fmt.Print("请输入你的猜测: ")
        fmt.Scanln(&guess)

        if guess < target {
            fmt.Println("太小了!")
        } else if guess > target {
            fmt.Println("太大了!")
        } else {
            fmt.Printf("恭喜!你用了%d次猜中了!\n", attempts)
            break
        }
    }
}

示例2:九九乘法表

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()
    }
}

示例3:质数判断

package main

import "fmt"

func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    if n == 2 {
        return true
    }
    if n%2 == 0 {
        return false
    }

    for i := 3; i*i <= n; i += 2 {
        if n%i == 0 {
            return false
        }
    }
    return true
}

func main() {
    fmt.Println("100以内的质数:")
    count := 0
    for i := 2; i <= 100; i++ {
        if isPrime(i) {
            fmt.Printf("%d ", i)
            count++
            if count%10 == 0 {
                fmt.Println()
            }
        }
    }
    fmt.Printf("\n共有%d个质数\n", count)
}

示例4:斐波那契数列

package main

import "fmt"

func main() {
    n := 10
    a, b := 0, 1

    fmt.Printf("前%d个斐波那契数:\n", n)
    for i := 0; i < n; i++ {
        fmt.Printf("%d ", a)
        a, b = b, a+b
    }
    fmt.Println()
}

示例5:成绩等级统计

package main

import "fmt"

func main() {
    scores := []int{95, 78, 85, 62, 45, 88, 92, 55, 73, 90}

    var excellent, good, pass, fail int

    for _, score := range scores {
        switch {
        case score >= 90:
            excellent++
        case score >= 80:
            good++
        case score >= 60:
            pass++
        default:
            fail++
        }
    }

    fmt.Println("成绩统计:")
    fmt.Printf("优秀(>=90): %d人\n", excellent)
    fmt.Printf("良好(80-89): %d人\n", good)
    fmt.Printf("及格(60-79): %d人\n", pass)
    fmt.Printf("不及格(<60): %d人\n", fail)
}

示例6:菜单系统

package main

import "fmt"

func main() {
    for {
        fmt.Println("\n=== 菜单系统 ===")
        fmt.Println("1. 查看信息")
        fmt.Println("2. 添加数据")
        fmt.Println("3. 删除数据")
        fmt.Println("4. 退出")
        fmt.Print("请选择: ")

        var choice int
        fmt.Scanln(&choice)

        switch choice {
        case 1:
            fmt.Println("查看信息...")
        case 2:
            fmt.Println("添加数据...")
        case 3:
            fmt.Println("删除数据...")
        case 4:
            fmt.Println("再见!")
            return
        default:
            fmt.Println("无效选择,请重试")
        }
    }
}

示例7:数字金字塔

package main

import "fmt"

func main() {
    rows := 5

    for i := 1; i <= rows; i++ {
        for j := 0; j < rows-i; j++ {
            fmt.Print(" ")
        }
        for k := 1; k <= 2*i-1; k++ {
            fmt.Print(k)
        }
        fmt.Println()
    }
}

示例8:数组查找

package main

import "fmt"

func main() {
    nums := []int{3, 7, 1, 9, 4, 6, 8, 2, 5}
    target := 6
    found := false
    index := -1

    for i, v := range nums {
        if v == target {
            found = true
            index = i
            break
        }
    }

    if found {
        fmt.Printf("找到了!%d在索引%d处\n", target, index)
    } else {
        fmt.Printf("未找到%d\n", target)
    }
}
最佳实践:

实践练习

  1. 编写程序,判断一个年份是否为闰年
  2. 实现一个简单的计算器(支持加减乘除)
  3. 打印1-100之间所有3的倍数
  4. 编写程序,找出数组中的最大值和最小值
  5. 实现冒泡排序算法
  6. 编写程序,反转一个字符串
  7. 计算1到100的和(使用for循环)
  8. 编写程序,打印杨辉三角
常见错误: