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

相关推荐
吴声子夜歌2 小时前
Java面试——ElasticSearch原理及应用
java·面试·es
吴声子夜歌2 小时前
Java面试——Spring原理及应用(一)
java·spring·面试
架构技术专栏2 小时前
Codex 已经成了 Claude Code 的插件,我还要同时开三个窗口吗?
人工智能
亦皓ai2 小时前
AI时代后端工程(二):AI把代码写得越来越快,我却越来越不敢让它直接开工了
人工智能·算法·机器学习·搜索引擎·transformer
冬奇Lab2 小时前
开源项目第199期:OpenWiki — LangChain 出品的代码库自维护文档 CLI,为 Agent 而生
人工智能·开源·资讯
liangshanbo12152 小时前
Nginx 进程管理命令深度面试题解析
java·nginx·面试
冬奇Lab2 小时前
Code Agent 解剖(12):Harness 设计之二——上下文工程
人工智能·开源·agent
FII工业富联科技服务2 小时前
AI Agent底层逻辑解析:Token、上下文与异构计算的协同架构
人工智能
小弥儿2 小时前
GitHub今日热榜 | 2026-08-26:AI 大脑与知识管理扎堆
人工智能·学习·开源·github