Go04-控制结构

第3章:控制结构

3.1 条件语句

if 语句

go 复制代码
// 基本语法(不需要括号)
if age >= 18 {
    fmt.Println("成年人")
}

// 条件语句可以包含初始化语句
if score := getScore(); score >= 90 {
    fmt.Println("优秀")
} else if score >= 60 {
    fmt.Println("及格")
} else {
    fmt.Println("不及格")
}

多条件判断

go 复制代码
// 使用 && 和 ||
if age >= 18 && age <= 65 {
    fmt.Println("劳动年龄")
}

if day == "Saturday" || day == "Sunday" {
    fmt.Println("周末")
}

错误处理中的 if

go 复制代码
// Go 的惯用错误处理模式
result, err := doSomething()
if err != nil {
    fmt.Println("发生错误:", err)
    return
}

// 使用错误变量作用域
if err := doSomethingElse(); err != nil {
    fmt.Println("错误:", err)
}

3.2 switch 语句

基本 switch

go 复制代码
// 基本语法
switch day {
case "Monday":
    fmt.Println("星期一")
case "Tuesday":
    fmt.Println("星期二")
case "Wednesday", "Thursday", "Friday":
    fmt.Println("工作日")
default:
    fmt.Println("其他")
}

无条件 switch

go 复制代码
// 可以省略条件变量,相当于 if-else 链
switch {
case score >= 90:
    grade = "A"
case score >= 80:
    grade = "B"
case score >= 70:
    grade = "C"
case score >= 60:
    grade = "D"
default:
    grade = "F"
}

类型 switch

go 复制代码
// 接口类型断言
func printType(x interface{}) {
    switch x.(type) {
    case int:
        fmt.Printf("整数: %d\n", x)
    case float64:
        fmt.Printf("浮点数: %f\n", x)
    case string:
        fmt.Printf("字符串: %s\n", x)
    default:
        fmt.Printf("未知类型: %T\n", x)
    }
}

fallthrough

go 复制代码
// 使用 fallthrough 强制执行下一个 case
switch num := 1; {
case num > 0:
    fmt.Println("正数")
    fallthrough
case num > -10:
    fmt.Println("大于 -10")
// 注意:fallthrough 不会检查下一个 case 的条件
}

3.3 循环语句

Go 只有 for 循环,但支持多种循环模式。

基本 for 循环

go 复制代码
// 标准 for 循环
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

// 循环条件
sum := 0
for i := 1; i <= 100; i++ {
    sum += i
}
fmt.Println("1到100的和:", sum)

while 循环模拟

go 复制代码
// Go 没有 while,但可以用 for 模拟
n := 10
for n > 0 {
    fmt.Println(n)
    n--
}

// 无限循环
for {
    // 使用 break 退出
    if someCondition {
        break
    }
}

range 循环

go 复制代码
// 遍历切片
fruits := []string{"苹果", "香蕉", "橙子"}
for index, value := range fruits {
    fmt.Printf("索引: %d, 值: %s\n", index, value)
}

// 只需要值
for _, value := range fruits {
    fmt.Println(value)
}

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

// 遍历 map
user := map[string]int{
    "张三": 25,
    "李四": 30,
}
for name, age := range user {
    fmt.Printf("%s: %d岁\n", name, age)
}

// 遍历字符串(处理 Unicode)
for i, r := range "Hello, 世界" {
    fmt.Printf("索引: %d, 字符: %c, Unicode: %U\n", i, r, r)
}

break 和 continue

go 复制代码
// break - 退出循环
for i := 0; i < 100; i++ {
    if i == 5 {
        break  // 退出循环
    }
    fmt.Println(i)
}

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

// 标签 - 退出多层循环
outer:
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if i*j > 20 {
                break outer  // 退出外层循环
            }
            fmt.Printf("%d ", i*j)
        }
        fmt.Println()
    }

3.4 defer 语句

defer 用于延迟执行函数调用,常用于资源清理:

go 复制代码
func readFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close()  // 函数返回前执行

    // 处理文件...
    return nil
}

defer 执行顺序

go 复制代码
func main() {
    // defer 是后进先出(LIFO)
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
    // 输出:3, 2, 1
}

defer 与命名返回值

go 复制代码
func double(x int) (result int) {
    defer func() { result *= 2 }()  // 修改返回值
    return x
}

fmt.Println(double(3))  // 输出:6

3.5 练习

  1. 编写程序判断一个数是否为素数
  2. 使用 switch 实现一个简单的计算器
  3. 使用 for 循环打印九九乘法表
  4. 编写程序使用 defer 实现函数执行时间统计

3.6 下一章

下一章我们将学习 Go 语言的函数与方法

相关推荐
刘一说14 小时前
AI科技热点日报 | 2026年08月04日
人工智能·科技
INNOVIX稳石机器人14 小时前
从“存得下”到“管得活”:稳石四向穿梭车如何重塑密集仓储新逻辑?
大数据·运维
如此这般英俊14 小时前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
云端漫步198714 小时前
HarmonyOS NEXT AI 智能生活助手:AI 日程规划
人工智能·华为·生活·harmonyos
宵时待雨14 小时前
优选算法专题12:队列
算法·leetcode·职场和发展
孙启超14 小时前
【AI应用开发】怎么降低 Agent 幻觉?有几种可行方案?
大数据·人工智能·llm·agent·rag·幻觉·ai应用开发
丘丘用户思思澪14 小时前
生产环境下优化 Agent Token 成本的系统化实战指南
人工智能
我是大卫14 小时前
图解RAG,一张图理解检索增强生成
人工智能
淡忘suuda14 小时前
生产级 AI Agent 评测体系实战:从数据集构建到自动回归与质量门禁
人工智能·数据挖掘·回归
spider_xcxc14 小时前
生产级AI智能体的可观测性实战:从指标监控到LLM评估
大数据·人工智能