【Go语言】循环控制

270 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

for 循环语句分析

1. 结构:

for (初始化语句;条件判断语句;条件控制语句) {

循环体语句

}

结构分解: img

解析: 在此结构中,初始化语句用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样。条件判断语句用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去。循环体语句用于表示循环反复执行的内容,简单说就是循环反复执行的事情。条件控制语句用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去。

2. 举例: 有一个初始值为0的变量i,已知它每次打印输出后就自增1,且它的最大值不能为5,请用for循环语句打印它的输出值。

 for i := 0; i < 5; i++ {                                        //for循环语句
    fmt.Println(i)                                                 //语句&表达式输出
 }

终端输出:img

结构解析:

 for i := 0; i < 5; i++ {                                        //for循环语句
  }

for循环语句:在Go中, for循环根据循环计数器或循环变量实现代码的重复执行。函数编译进入for循环语句中时,先执行初始化语句以后开始执行条件判断语句进行判断说明,确定其结果为true还是false,且如果为false时,则循环会结束,但如果是true则继续向下执行从而执行循环体语句,循环体语句结束以后执行条件控制语句再重复判断条件的执行,从而实现条件的循环判断输出。

 fmt.Println(i)                                                 //语句&表达式输出(函数体语句)

函数体语句: 在函数中具有实现指定功能的代码块即为函数的函数体,在此函数体中实现的功能就是打印输出返回的结果,Println 函数是属于包 fmt 的函数。

for无限循环语句分析

1. 结构:

for {

条件控制语句

If{

循环体语句;

break

}

}

结构分解: img

解析: 在无限循环中,for 中的条件判断——控制是否循环的开关每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。

2. 举例: 比较两个数的大小,判断循环是否依旧执行。

 var a2 = 10                                                         //变量的初始化
 var i = 1
 for {                                                                //for无限循环
    i++
    if i > a2 {
       fmt.Println("循环结束,跳出循环")                            //语句&表达式输出
       break
    }
 }

终端输出:img

结构解析:

 var a2 = 10                                                         //变量的初始化
 var i = 1

变量的声明赋值: Go语言是静态类型语言,因此变量(variable)是有明确类型的。编译器会检查函数调用中,变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。

 for {                                                                //for无限循环
    i++
    if i > a2 {
       fmt.Println("循环结束,跳出循环")                               //语句&表达式输出
       break
    }
 }

for无限循环: 无限循环在收发处理中较为常见,但需要无限循环有可控的退出方式来结束循环。当在结束每次循环前执行的语句,如果循环被 break、goto、return、panic 等语句强制退出,则结束语句不会被执行。该语句中无须设置 i 的初始值,因此忽略 for 的初始语句,两个分号之间是条件表达式,也被忽略,此时循环会一直持续下去,for 的结束语句为 i++,每次结束循环前都会调用。判断 i 大于a2 时,通过 break 语句跳出 for 循环则循环结束。

for循环嵌套语句分析

1. 结构:

for (循环变量初始化;终止条件表达式;循环变量的增量){

语句或语句块;

for(循环变量初始化;终止条件表达式;循环变量的增量){

语句或语句块;

}

}

结构分解img

解析:在 for 循环中可以嵌套一个也可以嵌套多个 for 循环。一个循环结构内可以含有另一个循环,称为循环嵌套,又称多重循环。常用的循环嵌套是二重循环,外层循环称为 外循环,内层循环称为内循环。

2. 举例:使用for嵌套循环来输出九九乘法表。

 package main                                                     //包的声明
 import "fmt"                                                      //引入包
 func main() {                                                      //函数
    for i := 1; i < 10; i++ {                                           //for循环嵌套
       for j := 1; j <= i; j++ {
          fmt.Printf("%d * %d = %2d\t", i, j, i*j)
       }
       fmt.Println()
    }
 }

终端输出:img

结构解析:

 package main                                               //包的声明

包声明:package main 定义了包名。它在源文件中指明了这个文件属于那个包。

import "fmt"                                                  //引入包

引入包: import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包,fmt 包实现了格式化 IO(输入/输出)的函数。

func main() {                                                        //函数

函数:func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。

for i := 1; i < 10; i++ {                                           //for循环嵌套
      for j := 1; j <= i; j++ {
         fmt.Printf("%d * %d = %2d\t", i, j, i*j)
      }
      fmt.Println()
   }

for循环嵌套: 一个循环结构内可以含有另一个循环,称为循环嵌套,又称多重循环。常用的循环嵌套是二重循环,外层循环称为 外循环,内层循环称为内循环。在执行过程中,先在外层判断循环条件,满足进入外层循环体后,进入内层判断循环条件,判断成功以后开始内层循环体执行,然后内层循环变量增加,回到内层循环条件执行判断,直到不满足内层条件跳出,再开始外层循环累加执行,当外层条件也不满足后,则会完全退出循环。结束嵌套过程。

for range循环语句分析

1. 结构

for key, val := range coll {

}

释义:val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。Key值为下标的索引。Coll为循环输出的元素数组。

结构分解:img

解析: for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel)。每个 rune 字符和索引在 for range 循环中是一一对应的,它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。Go语言和其他语言类似,可以通过 for range 的组合,对字符串进行遍历,遍历时,k 和 v分别代表字符串的索引和字符串中的每一个字符。

2. 举例: 请通过for range循环打印“知链区块链人才培养摇篮”。

var string1 string = "知链区块链人才培养摇篮"               //变量的声明赋值
for k, v := range string1 {                                 //for range循环
   fmt.Println(k, string(v))
}

终端输出:img

结构解析:

var string1 string = "知链区块链人才培养摇篮"               //变量的声明赋值

变量声明赋值:在Go语言中给变量的声明赋值可以分为三个阶段,先创建变量,在内存中开辟空间后再初始化变量,将变量初始化为underfined,最后再进行真正赋值。

for k, v := range string1 {                                 //for range循环语句
   fmt.Println(k, string(v))
}

for range* *循环语句:**for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel)。在for range 循环打印的过程中如果打印的中文的字符串则中文字符的key值按照+3顺序递增,如果打印的是英文字符串则英文字符的key值按照+1顺序递增。在此语句中通过对初始化的字符串进行打印且key值依照+3的顺序进行递增。

fmt.Println(k, string(v))                                     //语句&表达式输出

语句&表达式输出:fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。

Goto跳转语句分析

1. 结构:

goto label;

..

label: statement;

运行流程: img

结构分解: img

解析: Go 语言的 goto 语句可以无条件地转移到程序中指定的行。且通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。在此语句中FLAG为标签,该标签后的语句一般代表语句跳转后下一步代码在哪里执行,它与条件语句结合使用后,在该程序中不满足条件时就会进行自增长输出,当满足时则通过goto跳转从标签处再开始。

2. 举例: 有一个初始值为10的变量x,当他小于20时进入循环中,在变量x自增的情况下,若为偶数时则可自动输出,若为奇数时则跳转进入循环。请使用Goto跳转语句实现此程序。

var x int = 10                                                 //变量的初始化赋值
flag:                                                          //Goto语句跳转
   for x < 20 {
      if x%2 == 1 {
         x = x + 1
         goto flag
      }
      fmt.Printf("x的值为 : %d\n", x)
      x++
   }

终端输出:img

结构解析:

var x int = 10                                                 //变量的初始化赋值

变量的初始化赋值: Go语言是静态类型语言,因此变量(variable)是有明确类型的。编译器会检查函数调用中,变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。在此语句中通过元组变量声明并指定出变量数据存储的空间,然后通过赋值运算符将数值赋值给变量。

flag:                                                          //Goto语句跳转
   for x < 20 {
      if x%2 == 1 {
         x = x + 1
         goto flag
      }
      fmt.Printf("x的值为 : %d\n", x)
      x++
   }

Goto语句跳转: Go 语言的 goto 语句可以无条件地转移到程序中指定的行。且通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。在此语句中LOOP为标签,该标签后的语句一般代表语句跳转后下一步代码在哪里执行,它与条件语句结合使用后,在该程序中不满足条件时就会进行自增长输出,当满足时则通过goto跳转从标签处再开始。 但是在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。