零基础 go - 24(流程控制 - 循环控制)

0 阅读3分钟

在程序中,程序运行的流程控制决定程序是怎么样执行的。

一、主要三大流程控制

  • 顺序控制
  • 分支控制
  • 循环控制

二、循环控制

程序重复执行某段代码,直到满足某个条件才停止

  • for循环

  • while循环(go中没有while,可以用for实现)

  • do...while循环(go中没有do...while,可以用for实现)

1、语法格式

image.png

2、for 循环的四要素

  • 循环变量初始化(可以放在for 的外层,也可以放在 for 后面)
  • 循环条件(可以放在for 后面或者for 的内部)
  • 循环操作,也叫循环体(放在for 的内部)
  • 循环变量迭代(可以放在for 的内部,也可以放在 for 后面)

3、for 循环执行流程

image.png

4、for 循环的使用注意事项和细节

  • 循环变量的作用域:在 for 循环中,循环变量的作用域是整个循环体,包括循环条件和循环操作部分。这意味着在循环体内可以访问和修改循环变量。
  • 循环条件返回一个布尔值的表达式
  • 循环体内的代码会重复执行,直到循环条件返回 false
  • for 遍历字符,本质上是按字节遍历。当有中文时,会按照字节遍历,导致中文字符被拆分
  • for range 遍历字符,本质上是按字符遍历。当有中文时,会按照字符遍历,能够正确处理中文字符

5、for 循环的使用方式有

  • 常规使用
  • 初始化变量和变量迭代写在其他地方
  • 省略初始语句和迭代语句,变成类似 while 循环的形式

image.png

  • 无限循环,省略所有三个部分,形成死循环,通常需要在循环体内使用 break 语句来退出循环

image.png

  • for ... range 写法(方便遍历字符和数组)

6、while 和 do while 的实现

  • while 循环可以通过省略 for 循环的初始语句和迭代语句来实现,形成类似 while 的循环结构

image.png

  • do...while 循环可以通过在 for 循环内部使用 break 语句来实现,确保循环体至少执行一次

image.png

三、 代码示例

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: 好
    }

}