舉杯邀明月,對飲成三人
流程控制
流程控制在我們程序中,只要有邏輯的地方你都可能會需要到,比如條件判斷,循環(huán)等。不知道是不是所有編程語言都有,但是在我接觸的語言中是都要的,比如C、Objective-C、swift、java,當(dāng)然在Go中也是有的,下面就記錄下在Go中的用法,大同小異,有一些很趣的區(qū)別
if
if應(yīng)該是我們用的最多的了,當(dāng)我們需要判斷條件的時候,往往都會用到,在go中if最大的變化就是不需要使用(),如下
var x = 100
if x > 10 {
println(x)
}
還有更6的功能,那就是居然可以在if中聲明一個變量,然后再判斷,用;隔開,第一次看見這種用法,感覺屌屌噠
//挺6的 居然可以在if判斷前聲明變量,但是只能在if條件中用 超出范圍則報錯
if j := 10; j > 9 {
fmt.Println("打印出",j)
}else {
}
//fmt.Println("打印出",j) //這里會報錯 超出范圍
for
for在程序中也是用的比較多的,一般的循環(huán),或者是快速遍歷
在Objective -C中或者C中,我們是這樣用的
//循環(huán)語句
for (int i = 0; i < 100; i ++) {
}
//Objective -C中快速遍歷
NSArray *array = @[@"22",@"33",@"2"];
for (NSString *str in array) {
NSLog(@" 打印信息:%@",str);
}
在go中循環(huán)唯一不同的也是不需要()
Lai:
for index := 2; index>0; index-- {
fmt.Println("indexStart",index)
for objc :=0;objc <10 ;objc++ {
fmt.Println("objc",objc)
for m :=0;m <10 ;m++ {
if m == 8{
continue Lai
}
fmt.Println("m",m)
}
}
}
在上面的例子中,用到了一個新的東西就是 ****標(biāo)簽****,一般和goto一起使用(goto稍后會將),但是這里也可以和continue和break使用,用來跳出多重循環(huán)外層循環(huán),這里的標(biāo)簽就是Lai,這個可以隨便定義,但是不能在循環(huán)里面進(jìn)行定義(測試的時候發(fā)現(xiàn)的)。
關(guān)于continue和break相信大家一定都知道,前者是跳過本次循環(huán)而后者是跳出當(dāng)前循環(huán),看下上面代碼的輸出結(jié)果,相信大家就能更好的理解標(biāo)簽
indexStart 2
objc 0
m 0
m 1
m 2
m 3
m 4
m 5
m 6
m 7
indexStart 1
objc 0
m 0
m 1
m 2
m 3
m 4
m 5
m 6
m 7
如果把continue換成break又是什么結(jié)果呢?答案是這樣的
indexStart 2
objc 0
m 0
m 1
m 2
m 3
m 4
m 5
m 6
m 7
感興趣的朋友可以試試,不加Lai這個標(biāo)簽的結(jié)果
在go中,我們還可以將for配合range這個方法來實(shí)現(xiàn)快速遍歷,實(shí)現(xiàn)獲取數(shù)組或者是字典中的值,下面看兩個例子
//range和for配合使用
pDic := map[string]string{"name":"gao","sex":"男","home":"閬中"}
for k,value:=range pDic {
println("key",k)
println("value",value)
}
結(jié)果如下
key name
value gao
key sex
value 男
key home
value 閬中
經(jīng)測試,如果在遍歷字典的時候,定義變量的時候,第一個始終代表的是key,第二個代表value,如果我們只定義一個變量,那么獲取的結(jié)果將會全是key
pDic := map[string]string{"name":"gao","sex":"男","home":"閬中"}
for value:=range pDic {
//println("key",k)
println("value",value)
}
結(jié)果
value name
value sex
value home
在go中,如果定義一個變量卻不使用的話,是會報錯的,這里我們可以用_來代替,比如講上面的k換成_
pDic := map[string]string{"name":"gao","sex":"男","home":"閬中"}
for _,value:=range pDic {
//println("key",k)
println("value",value)
}
遍歷數(shù)組的話,可以如下這樣
mutableArrayC := []int{1,2,3,4,5,6,7,8,9,10}
for index,value := range mutableArrayC {
fmt.Println("array-index",index)
fmt.Println("array-value",value)
}
這和字典一樣,第一個變量代表的在數(shù)組中的位置,從0開始,第二個代表具體的值
在for中,還有一個用法,就是我們的第一個參數(shù)和第三個參數(shù)可以省略,比如下面這樣
total :=100
for ;total>0 ; {
total--
fmt.Println(total)
}
其實(shí)就是想兩個參數(shù)分別提出去了,當(dāng)然我們還可以簡化,去掉多余的兩個;那么就成了下面這樣
total :=100
for total>0 {
total--
fmt.Println(total)
}
哎喲,握草,這是啥,怎么那么眼熟,沒錯,這就是我們熟悉的while,哈哈,挺6的
上面我們提到過goto,那么這個goto又是啥呢?下面來看看
goto
顧名思義,就是馬上干什么,去干什么,一般和標(biāo)簽一起使用,先看個例子
nj := 1
comeon:
println(nj)
nj++
goto comeon //跳轉(zhuǎn)到comeon去
此處例子的功能,就是一個無限加的功能,并且打印出來,一執(zhí)行,簡直嚇壞我了。。。那速度,幸好我趕緊來了個停止
看看部分結(jié)果

switch
在go語言中,switch中沒有關(guān)鍵字break,如果滿足條件,那么它則直接跳出,和c中不一樣,在c中,如果不加break,那么當(dāng)條件滿足后,會將后面的都執(zhí)行一次,那么如果我們在go中要實(shí)現(xiàn)這樣的功能,又該如何呢?
這就需要用到一個關(guān)鍵字fallthrough下面看看兩個例子來說明
//和Objective-C不同,能定義string類型
abc := "back"
switch abc {
case "oh":
fmt.Println("oh...")
case "shirt":
fmt.Println("shirt...")
case "back":
fmt.Println("back...")
}
輸出
back...
下面我們加上fallthrough,并且將back...放到第二個判斷中
//和Objective-C不同,能定義string類型
abc := "back"
switch abc {
case "oh":
fmt.Println("oh...")
fallthrough
case "back":
fmt.Println("back...")
fallthrough
case "shirt":
fmt.Println("shirt...")
fallthrough
default:
}
結(jié)果
back...
shirt...
感覺屌屌噠,關(guān)于流程控制差不多就這么多,希望能幫到大家