Go提供的循环结构:
for循环
嵌套循环
如表所示:
循环类型 | 描述 |
---|---|
[for 循环] |
重复执行语句块 |
[循环嵌套] |
在 for 循环中嵌套一个或多个 for 循环 |
for循环
Go语言的for循环提供了三种形式
普通for循环
Java表示方式:
for (int i=0; i<10; i++){
}
go表示方式:
for i := 0; i < 10; i++{
}
//语法格式为
for init; condition; post { }
-
init: 一般为赋值表达式,给控制变量赋初值;
-
condition: 关系表达式或逻辑表达式,循环控制条件;
-
post: 一般为赋值表达式,给控制变量增量或减量。
类似while循环
Java表示方式:
while(表达式判断){
}
go表示方式:(和C语言的while一样)
package main
import "fmt"
var (
cirCula bool
)
func main() {
cirCula = true
for cirCula == true {
fmt.Println("这是一个真值,其值为:", cirCula)
break
}
fmt.Println("这不是一个真值,其值为:", cirCula)
}
类似C的for(;;)
package main
import "fmt"
func main() {
i := 0
for {
i++
fmt.Println(i)
if i == 65535 {
fmt.Println("收工!!!")
break
}
}
}
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。
类似Java,但又不同
public class PracticeCirculation{
private static int[] intArray = new int[]{3,5,7,9};
public static void main(String[] args){
for(int num : intArray){
System.out.Println(num);
}
}
}
go表示:
for key, value := range oldMap {
newMap[key] = value
}
//对字符串、数组、切片等进行迭代输出元素。
//go中的key, value是同时将两个变量变成oldMap里面的key值和value值
以数组举例:
package main
import "fmt"
var (
intArray [4]int
)
func main() {
//创建一个四个存储空间的数组
intArray = [4]int{3,5,7,9}
//使用range格式
for key, number := range intArray{
intArray[key] = number
fmt.Println(intArray[key]) //intArray数组0号索引的值,key为索引号
fmt.Println(number) //number为值本身
}
numbers := [6]int{1,2,3,4,5,6}
for i, j := range numbers{
fmt.Println("第 %d 位的x的值为 %d\n", i, j)
}
}
代码分析:
在第二个range循环当中
i为索引
j为索引下对应的值
这是定义了两个变量
go的for-each--->range循环:这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。
for语句执行过程分析:
-
1、先对表达式 1 赋初值;
-
2、判别赋值表达式 init 是否满足给定条件
-
若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;
-
否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。
-
嵌套循环
以冒泡排序举例:
for i := 0; i < len(numbers); i++ {
for j := 0; j < len(numbers)-1-i; j++ {
if numbers[j] > numbers[j+1] {
//设置中间变量
temp := numbers[j]
numbers[j] = numbers[j+1]
numbers[j+1] = temp
}
}
}
for i, j := range numbers{
fmt.Println("索引",i, "对应的值为", j)
}
循环控制语句
go语言提供了C语言中的goto语句,使得代码变得更灵活:
循环控制语句可以控制循环体内语句的执行过程。
控制语句 | 描述 |
---|---|
[break 语句] |
经常用于中断当前 for 循环或跳出 switch 语句 |
[continue 语句] |
跳过当前循环的剩余语句,然后继续进行下一轮循环。 |
[goto 语句] |
将控制转移到被标记的语句。 |
重点介绍goto语句
特点:
-
goto 语句可以无条件地转移到过程中指定的行
坏处:
-
结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
语法:
goto label;
..
.
label: statement;
特点:
-
Java当中虽然移除了goto语句,但是提供了label的方法来变相实现goto语句
-
package PracticeReview.Algorithm;
/**
* 使用Label的方式实现C中的goto语句
* @since JDK 1.8
* @date 2021/08/16
* @author Lucifer
*/
public class GoToCirculation {
private static int intArray = 10;
public static void goToLabel(int arr){
Loop:
while (intArray<20){
if (intArray==15){
//自增
intArray += 1;
continue Loop;
}
System.out.println(intArray);
intArray++;
}
}
} -
通过加标签
label
的方式来实现
-
-
go语言直接使用
关键字+标签
的形式更加直观的体现出来:
num := 10
Loop:
for num < 20 {
if num == 15 {
//自增,回到标签处
num += 1
goto Loop
}
fmt.Println(num)
num++
}
无限循环
循环中条件语句永远不为 false 则会进行无限循环
package main
import "fmt"
func main() {
for true {
fmt.Printf("这是无限循环。\n");
}
}