在程序中,程序运行的流程控制决定程序是怎么样执行的。
一、主要三大流程控制
- 顺序控制
- 分支控制
- 循环控制
二、循环控制
程序重复执行某段代码,直到满足某个条件才停止
-
for循环
-
while循环(go中没有while,可以用for实现)
-
do...while循环(go中没有do...while,可以用for实现)
1、语法格式
2、for 循环的四要素
- 循环变量初始化(可以放在for 的外层,也可以放在 for 后面)
- 循环条件(可以放在for 后面或者for 的内部)
- 循环操作,也叫循环体(放在for 的内部)
- 循环变量迭代(可以放在for 的内部,也可以放在 for 后面)
3、for 循环执行流程
4、for 循环的使用注意事项和细节
- 循环变量的作用域:在 for 循环中,循环变量的作用域是整个循环体,包括循环条件和循环操作部分。这意味着在循环体内可以访问和修改循环变量。
- 循环条件返回一个布尔值的表达式
- 循环体内的代码会重复执行,直到循环条件返回 false
- for 遍历字符,本质上是按字节遍历。当有中文时,会按照字节遍历,导致中文字符被拆分
- for range 遍历字符,本质上是按字符遍历。当有中文时,会按照字符遍历,能够正确处理中文字符
5、for 循环的使用方式有
- 常规使用
- 初始化变量和变量迭代写在其他地方
- 省略初始语句和迭代语句,变成类似 while 循环的形式
- 无限循环,省略所有三个部分,形成死循环,通常需要在循环体内使用 break 语句来退出循环
- for ... range 写法(方便遍历字符和数组)
6、while 和 do while 的实现
- while 循环可以通过省略 for 循环的初始语句和迭代语句来实现,形成类似 while 的循环结构
- do...while 循环可以通过在 for 循环内部使用 break 语句来实现,确保循环体至少执行一次
三、 代码示例
package main
import "fmt"
func main() {
// for 循环常规使用
for i:=1; i<=5; i++ {
fmt.Println(i)
}
// for 循环省略初始语句和迭代语句,类似 while 循环
j := 1
for j <= 5 {
fmt.Println(j)
j++
}
// 无限循环,使用 break 退出
k := 1
for {
if k > 5 {
break
}
fmt.Println(k)
k++
}
// for ... range 遍历字符 & for 变脸字符的区别
// for 遍历字符,本质上是按字节遍历。当有中文时,会按照字节遍历,导致中文字符被拆分
// for range 遍历字符,本质上是按字符遍历。当有中文时,会按照字符遍历,能够正确处理中文字符
str := "hi你好"
for i:=0; i<len(str); i++ {
fmt.Printf("index: %d, char: %c\n", i, str[i]) // 中文字符会被拆分
}
for index, char := range str {
fmt.Printf("index: %d, char: %c\n", index, char)
// 输出结果:中文字符不会被拆分。中文占据 3个字节,但被当作一个字符处理
// index: 0, char: h
// index: 1, char: i
// index: 4, char: 你
// index: 7, char: 好
}
for i:=0; i<len(str); i++ {
fmt.Printf("index: %d, char: %c\n", i, str[i]) // 中文字符会被拆分
}
// 如果一定用 for 遍历字符串,建议按字符切片后遍历,避免中文被拆分
for i, char := range []rune(str) {
fmt.Printf("index: %d, char: %c\n", i, char)
// 输出结果:中文字符不会被拆分。中文占据 3个字节,但被当作一个字符处理}
// index: 0, char: h
// index: 1, char: i
// index: 2, char: 你
// index: 3, char: 好
}
}