Go语言for循环语句详解:语法、用法与常见陷阱
Go语言仅提供 for 这一种循环控制结构,它灵活且强大,能够替代传统编程中的 while、do-while 等多种循环模式。本文将深入讲解 for 循环的四种核心语法形式,并通过文件读取、乘法口诀表打印以及中英文本遍历等实战案例,帮助开发者掌握其正确用法及处理中文乱码等常见陷阱。
for 循环的核心语法结构
在 Go 语言中,for 是执行重复任务的唯一方式。根据业务需求的不同,其语法结构主要分为以下四种形式:
第1步:使用完整语法的标准循环
这是最常见的写法,包含初始化、条件和迭代三个部分,常用于需要明确知道循环次数或索引的场景。
for 初始语句; 条件语句; 迭代后语句 {
// 循环体逻辑
}
第2步:使用条件判断的简化写法
仅保留条件表达式,分号可省略。这通常用于“当...时”的逻辑场景,等同于传统语言的 while 循环。
for 条件语句 {
// 循环体逻辑
}
第3步:无限死循环
若完全省略大括号内的内容,将构成无限循环。此时必须在循环体内使用 break 语句来安全退出,否则程序将一直运行直至终止。
for {
// 无限循环体
}
第4步:使用 range 进行范围遍历
针对集合数据(如数组、切片、Map、字符串等),可以使用 range 关键字自动获取索引/键和对应的值/字符,极大提升了代码的可读性。
for key, value := range 表达式/变量 {
// 遍历处理逻辑
}
实际应用场景示例
场景一:利用死循环读取文件内容
在处理不确定行数的文件流时,常采用死循环结合 EOF(End of File)判断的方式。这种模式能有效处理逐行读取的任务。
func readFile() {
//需导入 bufio、io、os 包
f, err := os.Open("abc.txt")
if err != nil {
fmt.Println("open error")
return
}
defer f.Close()
br := bufio.NewReader(f)
for {
s, _, c := br.ReadLine()
if c == io.EOF {
break // 到达文件末尾跳出循环
}
fmt.Println(string(s))
}
}
场景二:嵌套 for 循环打印乘法表
通过双层 for 循环可以清晰地展示行列逻辑,适用于生成表格类数据。
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%dx%d=%d ", j, i, i*j)
}
fmt.Println("") // 换行
}
进阶注意事项:字符串遍历的陷阱
初学者在使用 for 遍历字符串时容易遇到中文字符显示乱码的问题。这是因为 Go 的字符串底层由 UTF-8 字节序列组成,直接使用 []byte 类型的索引访问非 ASCII 字符会导致截断或乱码。
方法 A:直接遍历字节(仅适合纯英文/数字)
对于 ASCII 字符集,按字节访问是正确的做法:
var str = "Hello world!"
for i := 0; i < len(str); i++ {
fmt.Printf("str[%d]=%c\n", i, str[i])
}
方法 B:转换为 rune 类型处理中文
若涉及中文等多字节字符,需先将其转换为 []rune 切片。在 Go 中,rune 相当于其他语言中的 char,代表一个 Unicode 码点。
var str = "Hello 北京"
str2 := []rune(str) // 强制转换为 rune 切片
for i := 0; i < len(str2); i++ {
fmt.Printf("str[%d]=%c\n", i, str2[i])
}
关键避坑指南
- 花括号不可省: 即使是单行逻辑,
for循环体也必须用{ }包裹,不同于 if 的单行可选特性。 - 分号的灵活性: 如果只保留了条件表达式,初始化语句和后置语句旁边的分号可以全部省略,使代码更接近自然语言。
- 中文处理原则: 只要是涉及可读字符(非纯字节计算)的场景,建议优先使用
range遍历字符串,或者手动转换[]rune。
以上就是Go语言基础for循环语句的用法及示例详解的详细内容,更多关于Go语言for循环语句的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









