循环语句是编程中常使用的流程控制语句之一,go语言中,循环语句的关键字是for,没有while关键字,for语句可以根据指定的条件重复执行其内部的代码块,这个判断条件一般是有for关键字后面的子语句给出的
package main
import "fmt"
func main() {
for a := 0; a < 5; a++ {
fmt.Printf("a的值是%d\n", a)
}
}
上面的for关键字后面有三个自语句,初始化变量a为0,并判断当a小于5时执行下面代码块的内容,每次判断a的值都加1,知道不符合初始化语句的判断条件,退出循环。
for语句后面的三个自语句我们称为,初始化子语句,条件子语句,后置子语句。这三者不能颠倒顺序,其中条件子语句是必须的,条件子语句,会返回一个布尔型,true则执行代码块,false则跳出循环体
package main
import "fmt"
func main() {
a := 0
b := 5
for a < b {
a++
fmt.Printf("a的值是:%v\n", a)
}
}
上面的例子中,for关键字后面只有一个a<b的判断语句,这是典型的条件判断语句,
for ;a <b ;
go语言编译器会自动判断三个子语句中是否存在条件自语句
后置子语句的意思是先进行条件子语句判断,for代码块执行之后再对条件变量操作的语句进行判断,上面例子中a++就是一个后置子语句
range子语句
每一个for语句都可以使用一个特殊的range子语句,其作用类似迭代器,用于轮训数组或者切片值中的每一个元素,可以用于轮询字符串中每一个字符,以及字典值中的每一个键值对,甚至还可以持续读取一个通道类型值中的元素
package main
import "fmt"
func main() {
str := "abcz"
for i, char := range str {
fmt.Printf("字符串第%d个字符的值为%d", i, char)
}
for _, char := range str {
fmt.Println(char)
}
for i := range str {
fmt.Println(i)
}
for range str {
fmt.Println("all done")
}
}
range关键字右边是range表达式,表达式一般写在for语句前面,一遍提高代码易读性
for i := range "abez"
这样不仅降低了可读性,也不容易管理后续的循环代码
range关键字左边表示的是一对索引值对,根据不同的表达式返回不同的结果,
右边表达式返回的类型 | 第一个值 | 第二个值 |
string | index | str[index],返回类型是rune |
array /slice | index | str[index] |
map | key | m[key] |
channel | element |
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
for k, v := range m {
fmt.Println(k, v)
}
numbers := []int{1, 2, 3, 4}
for i, x := range numbers {
fmt.Printf("第%d次,x的值为%d\n", i, x)
}
}
返回第一个值为索引值,有时候并不是我们所需要的,因此可以使用——空标识符表示忽略第一恶返回值,对于空字典或切片,空数组,空字符串等情况。for语句会直接结束,不会循环。
但如果需要指定for执行循环的次数,例如需要获取数组里面的值,而数组有一个值是空字符串,则可以指定数据长度,强制让for循环执行相应的次数。
package main
import "fmt"
func main() {
numbers := [5]int{1, 2, 3, 4}
for i, x := range numbers {
fmt.Printf("第%d次,x的值为%d\n", i, x)
}
}
定义了numbers长度为5,但numbers[4]{1,2,3,4},因为数组 长度不够,会自动添加一个null单元
从for循环返回的信息可以看到第5次x的值为0,代码块执行了5次。