3.1 for结构简介
3.2 基于计数器的for循环
3.3 基于条件判断的for循环
3.4 for-range结构
3.5 无限循环
一、if else语句
1.1 基本语法
在有些情况下,条件语句两侧的括号是可以被省略的;当条件比较复杂时,则可以使用括号让代码更易读。条件允许是符合条件,需使用 &&、|| 或 !,你可以使用括号来提升某个表达式的运算优先级,并提高代码的可读性。
第一种形式:
if condition {
// do something
} else {
// do something
}
第二种形式:
if initialization; condition {
// do something
}
1.2 示例
package main
import "fmt"
func main() {
// 第一种形式
n := 7
if n >= 0 {
fmt.Printf("%d is >=0\n",n)
} else {
fmt.Printf("%d is <0\n",n)
}
//第二种形式
//初始化的变量为局部变量
if m := 9; m < 0 {
fmt.Printf("%d is <0\n",m)
} else if m > 0 {
fmt.Printf("%d is >0\n",m)
} else {
fmt.Printf("%d is = 0",m)
}
//带bool值的
if bool1 := true; !bool1 {
fmt.Printf("you are not right")
} else if bool1 {
fmt.Printf("you are right")
}
}
二、switch语句
2.1 基本语法
每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用fallthrough关键字来达到目的。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
2.2 示例
package main
import "fmt"
func main() {
switch n := 7; {
case n > 0 && n == 7 :
fmt.Printf("%d is > 0 && n == 7\n",n)
fallthrough
case n > 5 || n == 5 :
fmt.Printf("%d is > 5 || n == 5\n",n)
//fallthrough
default :
fmt.Printf("%d is unavailable\n",n)
}
}
三、for 语句
for结构简介
Go语言只有for循环这一种循环结构,Go语言中的for循环语句的三个部分不需要用括号括起来,但循环体必须用 { } 括起来。基本的for循环包含三个由分号分开的组成部分:
- 初始化语句:在第一次循环执行前被执行
- 循环条件表达式:每轮迭代开始前被求值
- 后置语句:每轮迭代后被执行
初始化语句一般是一个短变量声明,这里声明的变量仅在整个 for 循环语句可见。如果条件表达式的值变为 false,那么迭代将终止。
基于计数器的for循环
基于计数器的迭代,基本形式为:
for 初始化语句; 条件语句; 修饰语句 {
//循环语句
}
我们用for循环来计算100以内正整数的和。
package main
import "fmt"
func main(){
sum := 0
for i:=1;i<100;i++{
sum += i
}
fmt.Println(sum)
}
由花括号括起来的代码块会被重复执行已知次数,该次数是根据计数器(此例为 i)决定的。循环开始前,会执行且仅会执行一次初始化语句 i := 1;,这比在循环之前声明更为简短。紧接着的是条件语句 i < 100;,在每次循环开始前都会进行判断,一旦判断结果为 false,则退出循环体。最后一部分为修饰语句 i++,一般用于增加或减少计数器。
这三部分组成的循环的头部,它们之间使用分号 ; 相隔,但并不需要括号 () 将它们括起来。例如:
for (i = 0; i < 10; i++) { } //非法代码!
和if-else语句类似,for循环中左花括号{必须和 for 语句在同一行,计数器的生命周期在遇到右花括号} 时便终止
基于条件判断的for循环
for 循环的第二种形式是没有头部的条件判断(类似其它语言中的 while 循环),基本形式为:
for 条件语句 {}
也可以认为这是没有初始化语句和修饰语句的 for 结构,因此 ;;便是多余的了。我们来写一个基于条件判断的简单for循环,示例代码如下:
package main
import "fmt"
func main() {
var i int = 5
for i >= 0 {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
}
}
for-range结构
提到for循环,我们必须再提一下range()这个内置函数,这是 Go 语言特有的一种的迭代结构,它一般用来遍历数组,slice和map等集合。我们用range来遍历一个数组,以下代码会打印出每个值的序号和对应的值。
package main
import(
"fmt"
)
func main() {
arr := [...]int{6, 7, 8}
for i, v := range arr {
fmt.Println(i,v)
}
}
无限循环
Go 语言有以下几种无限循环:
i:=0; ; i++
for { }
for ;; { }
for true { }
这些无限循环都是 for 循环的条件语句被省略了。如果 for 循环的头部没有条件语句,那么就会认为条件永远为 true。因此如果不想造成死循环,循环体内必须有相关的条件判断以确保会在某个时刻退出循环。
四、Break 与 continue
4.1 break语句
一个 break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)。但在 switch 或 select 语句中,break 语句的作用结果是跳过整个代码块,执行后续的代码。
package main
import "fmt"
func main() {
for n := 1; n < 5; n++ {
for m := 1; m < 5; m++ {
if m == 2 {
break
}
fmt.Printf("%d VS %d\n",n,m)
}
}
}
4.2 continue语句
关键字 continue 忽略剩余的循环体而直接进入下一次循环的过程,关键字 continue 只能被用于 for 循环中
package main
import "fmt"
func main() {
for n := 1; n < 5; n++ {
if n == 2 {
continue
}
fmt.Printf("%d\n",n)
}
}
五、goto语句
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,标签的名称是大小写敏感的,为了提升可读性,建议使用全部大写字母
package main
import "fmt"
func main() {
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
goto LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
LABEL1:
}