Go 中的 for 循环控制结构
for 声明是 Go 中唯一的一个循环声明,普通的用法如下:
for "initialization statements"; "bool expression that has to evaluate to true"; "statements run prior to every loop except the first" {
// Code to be executed if the boolean expression evaluates to true
}
翻译过来为:
for "初始化声明"; "条件判断,为真是循环才执行"; "除第一外每一次循环都会执行的声明" {
// 循环主体
}
上面的三个部分中,任何一个部分都是可以不写的,但是即使不写,那个属于它的结束符的分号却还是必须要写,除非三个声明都没有的时候,所有的分号都可以一并省略,请看下面的示例:
package main
import "fmt"
func main() {
// 初始化i为0;每一次循环之后检查i是否小于5;让i加1
for i := 0; i < 5; i++ {
fmt.Println("i现在的值为:", i)
}
}
执行输出结果为:
cox@Cox:~/workspace/go/src/gotutorial$ go run forloop1.go
i现在的值为: 0
i现在的值为: 1
i现在的值为: 2
i现在的值为: 3
i现在的值为: 4
从上面的结果可以看到,我们在定义 i 的初始值为0之后,在循环主体第一次执行前,i++是没有运行的,所以我们来能取得它的初始值 0。下面这些循环体你都可以在自己的示例中去运行:
// 没有判断声明,循环将永远不停的执行
for i := 0; ; i++ {
fmt.Println("i现在的值为:", i)
}
// 因为 i 的值不会变化,而i的初始值小于3,所以,它将永远小于3,那么循环加永远运行
for i := 0; i < 3; {
fmt.Println("i现在的值为", i)
}
// 虽然我们没有在 *for* 中声明初始值以及变量的变量方式,但是我们把初始化移到for循环外面,然后把初始变量的变化声明移动到循环里面也是可以的,下面代码的输出将为:
// s的值为:
// s的值为: a
// s的值为: aa
// s的值为: aaa
// s的值为: aaaa
s := ""
for ; s != "aaaaa"; {
fmt.Println("s的值为:", s)
s = s + "a"
}
在 Go 的 for 循环里面,你可以同时初始化多个变量,多个条件判断或者同时更新多个值,请看下面的示例:
package main
import "fmt"
func main() {
for i, j, s := 0,5,"a"; i < 3 && j < 100 && s != "aaaaa"; i, j, s = i+1, j+1, s + "a" {
fmt.Printf("i=%d, j=%d, s=%sn", i, j, s)
}
}
输出:
i=0, j=5, s=a
i=1, j=6, s=aa
i=2, j=7, s=aaa
第三次循环之后,虽然 i < 100 与 s != "aaaaa" 都成立,但是 i < 3 已经不成立,所以循终止。
break 关键字
break 的作用是让循环在它所出现的地方终止,然后执行该循环后面的下一行代码或指令,如下示例:
package main
import "fmt"
func main() {
i := 0
for {
if i >= 3 { break }
fmt.Println("当前i的值为:", i)
i++
}
fmt.Println("for后的第一个声明")
}
输出为:
当前i的值为: 0
当前i的值为: 1
当前i的值为: 2
for后的第一个声明
continue 关键字
continue 中止当前循环,然后回到循环的起始进行下一步循环,如下示例:
package main
import "fmt"
func main() {
for i := 0; i < 11; i++ {
if i%2 == 0 {
continue //我不输入偶数
}
fmt.Println("当前i的值为:", i)
}
}
输出为:
当前i的值为: 1
当前i的值为: 3
当前i的值为: 5
当前i的值为: 7
当前i的值为: 9
range 关键字
range 关键字让你可以遍历数据/Map,为了便于理解,你可以把它理解为“每一个XX的索引”,当你使用它对数组或者片段遍历时,每一次返回它们的索引,对于MAP遍历时,每一次返回它的键,如下示例:
package main
import "fmt"
func main() {
// 对于数组,range 返回数据的索引
a := [...]string{"a", "b", "c", "d"}
for i := range a {
fmt.Println("数组的第", i+1, "个值为:", a[i])
}
// 对于 map,返回每一个键
capitals := map[string]string {"France":"Paris", "Italy":"Rome", "China":"Beijing" }
for key := range capitals {
fmt.Println("Capital of", key, "is", capitals[key])
}
}
输出为:
数组的第 1 个值为: a
数组的第 2 个值为: b
数组的第 3 个值为: c
数组的第 4 个值为: d
Capital of Italy is Rome
Capital of France is Paris
Capital of China is Beijing
同时,range还可以同时返回两人个值,第一个值为索引或者键,第二个值为数组或者Map的值本身,比如上面的两人个循环我们可以改写成为下面这样也可以得到同样一输出:
package main
import "fmt"
func main() {
// 对于数组,range 返回数据的索引
a := [...]string{"a", "b", "c", "d"}
for i,v := range a {
fmt.Println("数组的第", i+1, "个值为:", v)
}
// 对于 map,返回每一个键
capitals := map[string]string {"France":"Paris", "Italy":"Rome", "China":"Beijing" }
for key,value := range capitals {
fmt.Println("Capital of", key, "is", value)
}
}
评论已关闭