一、循环语句
循环语句即for语句,您可能说:“不对,它不仅仅是for语句,还有while或者do-while”,真的很遗憾,go语言真的只有for,它认为提供一种就可以了,提供多了怕给程序员带来麻烦 :)
下面我们使用for循环计算1+2+3+4+……+100的和,和其它语言一样,我们使用循环100次的办法:
定义一个变量,让它从1开始循环100次,每次都判断它是否小于101,若是变量就加1
代码如下:
// 声明变量sum并初始化为0
sum := 0
// 定义变量i,循环100次,每次判断是否小于101
for i:= 1; i< 101; i++{
// 累加总和
sum += i
}
// 打印结果
fmt.println("sum=", sum)
结果如下图:
1、习惯的养成
2、上例变形
有的语言不允许在for后面定义变量,那么上例就可以变形为
sum, i := 0, 1
for i < 101 {
sum += i
i++
把for后面的变量i定义移至for的上面,i自增加放到for循环体内部,for后面只用于条件判断
3、无限循环
既然go语言去除了while关键字,哪么怎么表达无限循环呢?秘密就是for后面什么表达式都不带
for {
if i > 100 {
break
}
既然for后面无任何条件表达式了,但总不能让cpu一直跑下去构成死循环吧,所以这里使用了break关键字,当条件满足时break可以从当前for循环跳出来
二、range遍历
对于一篇博客文章来说,它有id(blogid)、标题(blogtitle)、内容(blogcontent)、发表日期(blogdate)等组成,假如这些信息都放在一个字符串数组中:
blog := []string{"blogid", "blogtitle", "blogcontent", "blogdate"}
那么我们怎么遍历这个数组呢?使用循环语句是我们最常用,同时也是最先想到的:
for i := 0; i < len(blog); i++ {
fmt.printf("%s\t", blog[i])
若读者对javascript脚本熟悉的话,应该知道有一个each遍历用法:
$.each(blog, function(i, item){
/* 这里的i为blog数组的索引,item为blog数组索引对应的值,例如当i值为1时,item的值为blogtitle */
alert("i = " + i + ", value = " + item)
});
客户端脚本的程序员是非常钟爱这个遍历用法的,所幸go语言也提供了类似用法:range,它和for关键字一块用于对数组、切片、字符串和map遍历。现在使用range把上面的遍历重写一下:
for i, value := range blog {
fmt.println("索引", i, "对应的值为", value)
运行结果:
三、跳转语句
使用循环时常伴随着break、continue、goto关键字,是的,您没有看错,goto关键字在go语言中得到了重用,早些年刚接触编程时,有经验的程序员总是谆谆教导:“能不用goto的就不要用goto”,所以很多语言总是在刻意回避goto,但在惜关键字如金的go语言中,goto又熠熠生辉起来。
下面使用goto关键字重写1+2+3+4+……+100的循环例子:
【备注】:
1、go语言没有++i,只有i++
还是那句话,go语言认为一种方法能把问题解决就不用提供第二种方法了
2、标签的作用域
上例中mybowl是一个标签,它的作用域包括
if i < 101 {
goto mybowl
但不包括fmt.println("sum=",sum),否则就会输出100次"sum="
四、练习题
1、请问该程序的输出结果是多少?
for i := 0; i < 5; i++ {
if i > 3 {
fmt.println("i=", i)
break
}
答案:
死循环。由于break只是跳出当前层的循环,所以当i=4时break可以使程序跳出for i:=0; i<5;i++{}这层循环,但跳不出第一层for{}这个无限循环。
2、请问该程序的输出结果是多少?
mybowl:
for {
for i := 0; i < 5; i++ {
if i > 3 {
fmt.println("i=", i)
break
}
该程序与上面程序1类似,只是增加了一个标签mybowl,那么这个程序会怎么样呢?
我们把mybowl标签及for{}无限循环看作第一层循环,for i:=0;i<5;i++{}看作第二层循环,当i为4时条件语句满足,执行break跳出第二层循环进入第一层循环,由于第一层循环是无限循环,所以这里是死循环,与mybowl标签没有任何关系。
3、请问该程序的输出结果是多少?
break mybowl
该程序与程序2不同之外仅在于break语句
输出i=4
原因是由于当i=4时条件语句满足,输出i=4后执行break语句,这里的break后面添加了标签mybowl,这也意味着是跳出mybowl标签,而mybowl标签是第一层循环,所以程序可以结束。
结束语:
要想熟悉一门语言,最重要的是用该语言写应用程序,多写就能多体会,熟能生巧 :)