循环语句:for、range -《Go语言实战指南》

简介: Go 语言使用 `for` 实现所有循环控制,无 `while` 和 `do...while`。支持经典三段式、条件判断(类似 `while`)、无限循环及 `range` 遍历数组、切片、字符串、map 和 channel。配合 `break` 和 `continue` 控制流程,字符串遍历按 Unicode 处理,避免乱码问题,map 遍历顺序随机。总结涵盖多种用法,灵活高效。

 

Go 语言没有 whiledo...while,所有循环控制统一通过 for 实现。搭配 range 关键字,可以高效遍历数组、切片、字符串、map 和 channel。


一、基本 for 语句

1. 经典三段式写法(类似 C)

for 初始化语句; 条件表达式; 递增语句 {
    // 循环体
}

示例:

for i := 0; i < 5; i++ {
    fmt.Println(i)
}

二、for 等价 while 的写法

当只需要判断条件:

i := 0
for i < 5 {
    fmt.Println(i)
    i++
}

等价于其他语言中的 while 循环。


三、无限循环

for {
    fmt.Println("无限循环")
    // 可通过 break 或 return 退出
}

四、使用 breakcontinue

for i := 0; i < 10; i++ {
    if i == 3 {
        continue // 跳过当前这轮
    }
    if i == 7 {
        break // 提前退出循环
    }
    fmt.Println(i)
}

五、使用 range 遍历结构

1. 遍历数组 / 切片

nums := []int{10, 20, 30}
for index, value := range nums {
    fmt.Printf("下标:%d 值:%d\n", index, value)
}

可忽略变量:

for _, val := range nums {
    fmt.Println(val)
}

2. 遍历字符串(按 Unicode 字符)

s := "hello 世界"
for i, r := range s {
    fmt.Printf("索引:%d 字符:%c\n", i, r)
}

注:Go 中 range 字符串会按 rune(字符) 处理,不会出现 UTF-8 半个字符乱码问题。


3. 遍历 map

m := map[string]int{"A": 1, "B": 2}
for k, v := range m {
    fmt.Printf("键:%s 值:%d\n", k, v)
}

遍历 map 的顺序是随机的,每次运行顺序可能不同。


4. 遍历 channel

ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
for v := range ch {
    fmt.Println(v)
}

六、小结

用法 示例
经典计数循环 for i := 0; i < n; i++
类似 while 循环 for 条件
无限循环 for {}
遍历数组、map、字符串 for k, v := range ...
控制语句 break, continue

 

相关文章
|
存储 Java 编译器
Go函数解密:底层工作原理
Go函数解密:底层工作原理
298 0
|
7月前
|
Go
多返回值(Multiple Return Values)- 《Go语言实战指南》
Go 语言支持函数返回多个值,这一特性在实际开发中非常常见,尤其用于错误处理。本文介绍了多返回值的基本语法、用于错误处理的方式、返回值命名、忽略不需要的返回值以及实际应用场景。通过计算商和余数、文件操作、网络响应等示例,展示了多返回值的灵活性。最后总结了使用建议,包括搭配 `error` 实现显式错误控制、命名返回值提升可读性以及用 `_` 忽略无用值等技巧。
217 19
|
7月前
|
监控 Kubernetes Go
日志采集效能跃迁:iLogtail 到 LoongCollector 的全面升级
LoongCollector 在日志场景中实现了全面的重磅升级,从功能、性能、稳定性等各个方面均进行了深度优化和提升,本文我们将对 LoongCollector 的升级进行详细介绍。
616 86
|
7月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
217 34
|
6月前
|
SQL 数据库连接 Go
Go语言数据库编程:GORM 的基本使用
GORM 是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近高层语言的 ORM。本文介绍了 GORM 的安装与初始化、模型定义、自动迁移、基本 CRUD 操作、条件构造器、钩子函数、事务处理、日志调试等内容,帮助开发者快速掌握其使用方法。
|
7月前
|
Go 数据处理
可变参数(Variadic Functions)- 《Go语言实战指南》
Go 语言支持可变参数函数,允许传入不定数量的参数,本质为切片(slice)。可变参数需置于参数列表最后,支持零个或多个参数传入,也可通过 `...` 将已有切片展开。不支持多个可变参数,调用时可直接传参或使用切片操作。适用于求和、拼接等动态数据处理场景,提升函数灵活性。
171 16
|
7月前
|
安全 Go 开发者
Go语言之切片的原理与用法 - 《Go语言实战指南》
切片(slice)是Go语言中用于处理变长数据集合的核心结构,基于数组的轻量级抽象,具有灵活高效的特点。切片本质是一个三元组:指向底层数组的指针、长度(len)和容量(cap)。本文详细介绍了切片的声明与初始化方式、基本操作(如访问、修改、遍历)、长度与容量的区别、自动扩容机制、共享与副本处理、引用类型特性以及常见陷阱。通过理解切片的底层原理,开发者可以更高效地使用这一数据结构,优化代码性能。
223 13
|
3月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
7月前
|
Go 容器
Go语言变量与常量 -《Go语言实战指南》
本章详细介绍了Go语言中变量与常量的基础知识。变量支持多种声明方式,包括标准声明、类型推导和短变量声明等,未初始化的变量会自动赋零值。常量在声明时必须赋值,且运行时不可更改,支持使用`iota`实现枚举。两者的主要区别在于变量可变而常量不可变,变量有零值而常量必须初始化。此外,还强调了`:=`的使用限制及代码整洁性要求,并通过实践示例巩固理解。掌握这些内容是学好Go语言的关键基础。
|
7月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
167 18