go循环
循环语句用于重复执行一段代码。
for
语句是Go中唯一的循环语句。Go没有提供其他语言(如C)中的while
和dowhile
语句。
for语句语法
for语句的语法如下:
forinitialisation;condition;post{ }12
其中,initialisation
为初始化语句,该语句仅执行一次。initialisation
语句结束后,接着对condition
求值,如果condition
求值结果为true
,则执行大括号{}
里面的循环体,然后执行post
语句,如果condition
求值结果为false
则退出循环。post
语句会在每次循环体执行结束后执行。执行完post
语句之后,condition
会被重新求值,如果是true
,则继续执行循环体,否则退出循环。
在Go中for
语句头部的三个部分:initialisation
,condition
,post
都是可选的。让我们看一个例子以更好的理解for
语句。
例子
下面的程序使用for
循环打印1
到10
之间的整数。
packagemain import( "fmt" ) funcmain(){ fori:=1;i<=10;i++{ fmt.Printf("%d",i) } } 123456789101112
在上面的程序中,i
被初始化为1
。条件语句判断i
是否小于等于10
,如果是则打印i
,否则结束循环。post
语句在每次迭代结束时将i
递增1
。直到i
的值大于10
循环结束。
上面的程序打印:12345678910
在for
头部定义的变量仅在for
语句范围内可见,因此i
不能在for
循环体外被访问。
break
break
语句用于终止for
循环,继续执行for
循环后面的语句。
下面的程序打印1
到5
之间的整数。请注意该程序中break
的用法。
packagemain import( "fmt" ) funcmain(){ fori:=1;i<=10;i++{ ifi>5{ break//loopisterminatedifi>5 } fmt.Printf("%d",i) } fmt.Printf("\nlineafterforloop") }123456789101112131415
在上面的程序中,每次迭代都会检查i
的值,如果i
大于5
则执行break
语句跳出循环,并执行for
循环后面的那条fmt.Printf
语句。上面的程序输出如下:
12345 lineafterforloop12
continue
continue
语句用于跳过for
循环的当前迭代。循环体中continue
语句之后的所有语句将被跳过不予执行。循环将继续执行下一次迭代。
让我们写一个程序利用continue
来打印1
到10
之间的奇数。
packagemain import( "fmt" ) funcmain(){ fori:=1;i<=10;i++{ ifi%2==0{ continue } fmt.Printf("%d",i) } }1234567891011121314
在上面的程序中,ifi%2==0
检测i
除以2
的余数是否为0
,如果为0
则i
是偶数,利用continue
语句跳过当前迭代并继续下一次迭代。因此continue
语句之后的fmt.Printf
语句将不被执行,并且循环进入到下一次迭代。上面的程序输出为:13579
。
更多例子
让我们再写一些代码来演示for
循环的其它变体。
下面的程序打印0
到10
之间的所有偶数。
packagemain import( "fmt" ) funcmain(){ i:=0 for;i<=10;{//initialisationandpostareomitted fmt.Printf("%d",i) i+=2 } }12345678910111213
我们已经知道for
循环头部的三个部分initialisation
,condition
,post
都是可选的。上面的程序中,忽略了initialisation
和post
部分。i
在for
循环之外初始化为0
,只要i<=10
循环就一直执行,i
在循环体内每次递增2
。上面的程序输出为:0246810
。
上面程序中的分号(;
)也可以省略。这种形式的for
循环可以视为while
循环的替代品。上面的程序可以被重写如下:
packagemain import( "fmt" ) funcmain(){ i:=0 fori<=10{//semicolonsareommittedandonlyconditionispresent fmt.Printf("%d",i) i+=2 } }12345678910111213
可以在for
循环中声明和操作多个变量,比如下面的程序:
packagemain import( "fmt" ) funcmain(){ forno,i:=10,1;i<=10&&no<=19;i,no=i+1,no+1{//multipleinitialisationandincrement fmt.Printf("%d*%d=%d\n",no,i,no*i) } }123456789101112
上面的程序中,no
和i
被声明并初始化为10
和1
。它们在每次迭代结束时递增1
。在condition
部分使用&&
操作符来确保i
小于或等于10
并且no
小于或等于19
。程序的输出如下:
10*1=10
11*2=22
12*3=36
13*4=52
14*5=70
15*6=90
16*7=112
17*8=136
18*9=162
19*10=19012345678910
无限循环
可以用下面的语法实现无限循环:
for{ }12
下面的程序将一直打印HelloWorld
永不终止。
packagemain import"fmt" funcmain(){ for{ fmt.Println("HelloWorld") } }123456789
如果你在goplayground执行上面的程序,你将得到一个错误:processtooktoolong
。请尝试在本地系统中运行它以无限打印"HelloWorld"
。
还有一个rangefor可用于遍历数组,我们将在介绍数组时介绍它。
原文链接: