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 语言的函数与方法

相关推荐
FII工业富联科技服务1 小时前
灯塔工厂用例解析:AI重构研发到量产全流程 NPI 体系实践
人工智能·重构
人生百态,人生如梦1 小时前
情感交互仿生人从技术到落地构想1——技术交流贴(2026.7)
人工智能·机器人·人机交互·交互
skywalk81631 小时前
TRAE AI 创造力大赛 - 趣赢分析器
人工智能·trae
金融小师妹1 小时前
AI多因子模型解析PPI信号:PPI数据降温紧缩加息预期,推动黄金回升——机器学习宏观预测框架
大数据·逻辑回归·线性回归
广凌股份(广凌科技)1 小时前
广凌基建管理一体化解决方案:从立项报建到验收归档的全周期闭环管控
大数据·人工智能
APItesterCris1 小时前
电商口碑自动化监控方案:30 分钟搭建商品评论实时采集 + 情感分析系统(完整可运行代码)
大数据·运维·数据仓库·自动化
延凡科技1 小时前
数字孪生全域智慧园区综合可视化运营平台|延凡科技智园视界解决方案
数据库·人工智能·物联网·数据可视化
SelectDB技术团队1 小时前
大规模集群治理:Apache Doris / SelectDB 的 CCR 无感升级、Colocate Join 与 Bitmap 精确去重
大数据·数据库·人工智能·agent·olap·selectdb·集群治理
触底反弹1 小时前
💥 暴力解 LeetCode 导致 OOM:10000 行数据撑爆 V8 堆内存的完整排查
javascript·算法·面试