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

相关推荐
豪气的程序猿26 分钟前
电商图片工作流怎么选?Lingko AI 对比折叠键盘主图与详情页
人工智能
YangYang9YangYan38 分钟前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
小刘快学习1 小时前
把 AI 账单拆到部门:企业 AI 网关的精准分账思路
人工智能
米小虾1 小时前
你让监控模型读的思维链,可能是攻击者写好的剧本
人工智能
尾善爱看海1 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
大大大大晴天1 小时前
OpenMetadata VS DataHub VS Atlas VS Gravitino
大数据
deepseek231 小时前
Iris 开源搜索智能体拆解:35B 与 397B 中文仅差 0.3 分,上下文管理胜过堆参数
人工智能·ai agent·开源模型
ai小陈1 小时前
CUDA Stream实战:让数据传输与GPU计算真正重叠
人工智能·深度学习·ai·pdf·云计算·gpu算力
residual_fan1 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
东风破_1 小时前
从 RAG 到 Agentic RAG:第二步,把复杂问题拆开再检索
人工智能