第三章:流程控制

第三章:流程控制

3.1 条件语句

if语句

go 复制代码
package main

import "fmt"

func main() {
    score := 85

    // 基本if语句
    if score >= 60 {
        fmt.Println("及格")
    }

    // if-else语句
    if score >= 90 {
        fmt.Println("优秀")
    } else {
        fmt.Println("还需努力")
    }

    // if-else if-else语句
    if score >= 90 {
        fmt.Println("优秀")
    } else if score >= 80 {
        fmt.Println("良好")
    } else if score >= 70 {
        fmt.Println("中等")
    } else if score >= 60 {
        fmt.Println("及格")
    } else {
        fmt.Println("不及格")
    }

    // if语句带初始化语句
    if num := 10; num%2 == 0 {
        fmt.Printf("%d是偶数\n", num)
    } else {
        fmt.Printf("%d是奇数\n", num)
    }
}

switch语句

go 复制代码
package main

import (
    "fmt"
    "time"
)

func main() {
    // 基本switch
    day := time.Now().Weekday()

    switch day {
    case time.Monday:
        fmt.Println("星期一")
    case time.Tuesday:
        fmt.Println("星期二")
    case time.Wednesday:
        fmt.Println("星期三")
    case time.Thursday:
        fmt.Println("星期四")
    case time.Friday:
        fmt.Println("星期五")
    case time.Saturday, time.Sunday:
        fmt.Println("周末")
    default:
        fmt.Println("未知")
    }

    // 多条件匹配
    month := time.Now().Month()
    switch month {
    case time.March, time.April, time.May:
        fmt.Println("春天")
    case time.June, time.July, time.August:
        fmt.Println("夏天")
    case time.September, time.October, time.November:
        fmt.Println("秋天")
    case time.December, time.January, time.February:
        fmt.Println("冬天")
    }

    // 无条件switch
    score := 85
    switch {
    case score >= 90:
        fmt.Println("优秀")
    case score >= 80:
        fmt.Println("良好")
    case score >= 70:
        fmt.Println("中等")
    case score >= 60:
        fmt.Println("及格")
    default:
        fmt.Println("不及格")
    }

    // 类型switch
    var x interface{} = "hello"
    switch v := x.(type) {
    case int:
        fmt.Printf("x是int: %d\n", v)
    case string:
        fmt.Printf("x是string: %s\n", v)
    case bool:
        fmt.Printf("x是bool: %v\n", v)
    default:
        fmt.Printf("x是未知类型: %T\n", v)
    }

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

3.2 循环语句

for循环

go 复制代码
package main

import "fmt"

func main() {
    // 基本for循环
    fmt.Println("基本for循环:")
    for i := 1; i <= 5; i++ {
        fmt.Printf("%d ", i)
    }
    fmt.Println()

    // while风格循环
    fmt.Println("while风格循环:")
    count := 1
    for count <= 5 {
        fmt.Printf("%d ", count)
        count++
    }
    fmt.Println()

    // 无限循环
    fmt.Println("无限循环 (使用break退出):")
    sum := 0
    for {
        sum += 1
        if sum > 5 {
            break
        }
        fmt.Printf("%d ", sum)
    }
    fmt.Println()

    // range遍历数组
    fmt.Println("range遍历数组:")
    arr := []int{10, 20, 30, 40, 50}
    for index, value := range arr {
        fmt.Printf("索引: %d, 值: %d\n", index, value)
    }

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

    // range遍历map
    fmt.Println("range遍历map:")
    scores := map[string]int{
        "张三": 90,
        "李四": 85,
        "王五": 95,
    }
    for name, score := range scores {
        fmt.Printf("姓名: %s, 分数: %d\n", name, score)
    }

    // range遍历channel
    fmt.Println("range遍历channel:")
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch)
    for v := range ch {
        fmt.Printf("%d ", v)
    }
    fmt.Println()
}

break和continue

go 复制代码
package main

import "fmt"

func main() {
    // break示例
    fmt.Println("break示例:")
    for i := 1; i <= 10; i++ {
        if i > 5 {
            break
        }
        fmt.Printf("%d ", i)
    }
    fmt.Println()

    // continue示例
    fmt.Println("continue示例 (跳过偶数):")
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Printf("%d ", i)
    }
    fmt.Println()

    // 带标签的break
    fmt.Println("带标签的break:")
    outer:
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 3; j++ {
            if i == 2 && j == 2 {
                break outer
            }
            fmt.Printf("(%d,%d) ", i, j)
        }
    }
    fmt.Println()

    // 带标签的continue
    fmt.Println("带标签的continue:")
    outer2:
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 3; j++ {
            if j == 2 {
                continue outer2
            }
            fmt.Printf("(%d,%d) ", i, j)
        }
    }
    fmt.Println()
}

3.3 goto语句

go 复制代码
package main

import "fmt"

func main() {
    i := 0

loop:
    if i < 5 {
        fmt.Printf("%d ", i)
        i++
        goto loop
    }
    fmt.Println()
}

3.4 defer语句

go 复制代码
package main

import "fmt"

func main() {
    // defer基本用法
    fmt.Println("开始")
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")
    fmt.Println("结束")
    // 输出顺序: 开始 结束 defer 3 defer 2 defer 1

    // defer用于资源清理
    fmt.Println("\n文件操作示例:")
    fmt.Println("打开文件")
    defer fmt.Println("关闭文件")
    fmt.Println("读取文件")
    fmt.Println("处理数据")

    // defer与匿名函数
    fmt.Println("\ndefer与匿名函数:")
    x := 10
    defer func() {
        fmt.Printf("defer中的x: %d\n", x)
    }()
    x = 20
    fmt.Printf("修改后的x: %d\n", x)

    // defer执行顺序
    fmt.Println("\ndefer执行顺序:")
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
    fmt.Println()
}

3.5 实战案例:成绩统计系统

go 复制代码
package main

import (
    "fmt"
    "sort"
)

// Student 学生结构体
type Student struct {
    Name  string
    Score int
}

func main() {
    // 学生成绩数据
    students := []Student{
        {"张三", 90},
        {"李四", 85},
        {"王五", 95},
        {"赵六", 78},
        {"钱七", 92},
        {"孙八", 88},
        {"周九", 76},
        {"吴十", 98},
    }

    // 统计信息
    var totalScore int
    maxScore := students[0].Score
    minScore := students[0].Score
    maxStudent := students[0].Name
    minStudent := students[0].Name

    // 成绩等级统计
    gradeCount := map[string]int{
        "优秀": 0,
        "良好": 0,
        "中等": 0,
        "及格": 0,
        "不及格": 0,
    }

    // 遍历统计
    for _, student := range students {
        totalScore += student.Score

        // 更新最高分和最低分
        if student.Score > maxScore {
            maxScore = student.Score
            maxStudent = student.Name
        }
        if student.Score < minScore {
            minScore = student.Score
            minStudent = student.Name
        }

        // 统计等级
        switch {
        case student.Score >= 90:
            gradeCount["优秀"]++
        case student.Score >= 80:
            gradeCount["良好"]++
        case student.Score >= 70:
            gradeCount["中等"]++
        case student.Score >= 60:
            gradeCount["及格"]++
        default:
            gradeCount["不及格"]++
        }
    }

    // 计算平均分
    avgScore := float64(totalScore) / float64(len(students))

    // 按成绩排序
    sortedStudents := make([]Student, len(students))
    copy(sortedStudents, students)
    sort.Slice(sortedStudents, func(i, j int) bool {
        return sortedStudents[i].Score > sortedStudents[j].Score
    })

    // 输出结果
    fmt.Println("=" + strings.Repeat("=", 50))
    fmt.Println("学生成绩统计系统")
    fmt.Println("=" + strings.Repeat("=", 50))

    fmt.Printf("\n学生总数: %d\n", len(students))
    fmt.Printf("总分: %d\n", totalScore)
    fmt.Printf("平均分: %.2f\n", avgScore)
    fmt.Printf("最高分: %d (%s)\n", maxScore, maxStudent)
    fmt.Printf("最低分: %d (%s)\n", minScore, minStudent)

    fmt.Println("\n成绩等级分布:")
    for grade, count := range gradeCount {
        if count > 0 {
            percentage := float64(count) / float64(len(students)) * 100
            fmt.Printf("  %s: %d人 (%.1f%%)\n", grade, count, percentage)
        }
    }

    fmt.Println("\n成绩排名:")
    for i, student := range sortedStudents {
        fmt.Printf("  第%d名: %s - %d分\n", i+1, student.Name, student.Score)
    }
    fmt.Println("=" + strings.Repeat("=", 50))
}
相关推荐
cocoCola9166718 小时前
用户模块讲义
go
Sinclair1 天前
安企CMS的安装-源码编译安装
运维·后端·go
wear工程师2 天前
Go 的 map 并发读写,面试里别上来就答「sync.Map」
面试·go
HokKeung2 天前
用 Cobra 写一个像样的 Go 命令行工具
go·命令行
黑贝是条狗2 天前
一个从零到一,全部由AI实现的开放平台
go·ai vibe coding
ArixBit3 天前
从目录分层到交付验证:我的 Go 后端工程实践
go
ArixBit3 天前
用 Go 手撸 Agent 框架 #9:把最小 Agent 抽成 Runtime
go·agent
江畔柳前堤3 天前
Go04-控制结构
大数据·人工智能·面试·职场和发展·go·业界资讯
用户6757049885024 天前
别再乱用了!var arr []int 和 arr := []int{} 给整懵了?不就声明个空数组,项目居然崩了?
后端·go