Go流程结构(for)
一、程序的流程结构
程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。
顺序结构:代码从上向下逐行的执行
选择结构:条件满足,某些代码才会被执行。0-1次
if语句,switch语句
循环结构:条件满足,某些代码会被反复的多次执行。0-n次
for语句
二、循环语句
循环语句表示条件满足,可以反复的执行某段代码。
for是唯一的循环语句。(Go没有while循环)
2.1 for语句
语法结构:
for init; condition; post { }
初始化语句只执行一次。在初始化循环之后,将检查该条件。如果条件计算为true,那么{}中的循环体将被执行,然后是post语句。post语句将在循环的每次成功迭代之后执行。在执行post语句之后,该条件将被重新检查。如果它是正确的,循环将继续执行,否则循环终止。
示例代码:
package main import ( "fmt" ) func main() { for i := 1; i <= 10; i++ { fmt.Printf(" %d",i) } }
在for循环中声明的变量仅在循环范围内可用。因此,i不能在外部访问循环。
2.2 for循环变体
所有的三个组成部分,即初始化、条件和post都是可选的。
for condition { }
效果与while相似
for { }
package main import "fmt" func main() { /* 1. 标准写法: for 表达式1;表达式2;表达式3{ 循环体 } 2.同时省略表达式1和表达式3 for 表达式2{ } 相当于while(条件) 3.同时省略3个表达式 for{ } 相当于while(true) 注意点:当for循环中,省略了表达式2,就相当于直接作用在了true上 4.其他的写法:for循环中同时省略几个表达式都可以。。 省略表达式1: 省略表达式2:循环永远成立-->死循环 省略表达式3: */ i := 1 for i <= 5 { fmt.Println(i) i++ } fmt.Println("-->",i) fmt.Println("------------") for{ fmt.Println("i--->",i) i++ } }
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
for key, value := range oldMap { newMap[key] = value } package main import "fmt" func main() { var b int = 15 var a int numbers := [6]int{1, 2, 3, 5} /* for 循环 */ for a := 0; a < 10; a++ { fmt.Printf("a 的值为: %d\n", a) } for a < b { a++ fmt.Printf("a 的值为: %d\n", a) } for i,x:= range numbers { fmt.Printf("第 %d 位 x 的值 = %d\n", i,x) } }
2. 3 多层for循环
for循环中又有循环嵌套,就表示多层循环了。
三、跳出循环的语句
1、 break语句
break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环
示例代码:
package main import ( "fmt" ) func main() { for i := 1; i <= 10; i++ { if i > 5 { break //loop is terminated if i > 5 } fmt.Printf("%d ", i) } fmt.Printf("\nline after for loop") }
2、continue语句
continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。在continue语句后面的for循环中的所有代码将不会在当前迭代中执行。循环将继续到下一个迭代。
示例代码:
package main import ( "fmt" ) func main() { for i := 1; i <= 10; i++ { if i%2 == 0 { continue } fmt.Printf("%d ", i) } }
四、goto语句
goto:可以无条件地转移到过程中指定的行。
语法结构:
goto label; .. .. label: statement;
package main import "fmt" func main() { /* goto语句: */ var a = 10 LOOP: for a < 20 { if a == 15 { a += 1 goto LOOP } fmt.Printf("a的值为:%d\n", a) a++ } fmt.Println("----------------") for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { goto breakHere } fmt.Println("j的值为", j) } } breakHere: fmt.Println("done...") }
统一错误处理 多处错误处理存在代码重复时是非常棘手的,例如:
err := firstCheckError() if err != nil { goto onExit } err = secondCheckError() if err != nil { goto onExit } fmt.Println("done") return onExit: fmt.Println(err) exitProcess()