這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一、迴圈語句
聽 聽 迴圈語句即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、習慣的養成
若您一直使用C/C++/Java開發的話,此時您可能會說:“for迴圈與if一樣,後面沒有括弧,真不習慣”,是的,一開始真不習慣,等您寫上30遍之後就習慣了
2、上例變形
有的語言不允許在for後面定義變數,那麼上例就可以變形為
sum, i := 0, 1
for i < 101 {
聽 聽 sum += i
聽 聽 i++
}
fmt.Println("sum=", sum)
把for後面的變數i定義移至for的上面,i自增加放到for迴圈體內部,for後面只用於條件判斷
3、無限迴圈
既然GO語言去除了while關鍵字,哪麼怎麼表達無限迴圈呢?秘密就是for後面什麼運算式都不帶
sum, i := 0, 1
for {
聽 聽 if i > 100 {
聽 聽 聽 聽 break
聽 聽 }
聽 聽 sum += i
聽 聽 i++
}
fmt.Println("sum=", sum)
既然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)
}
運行結果:
管中窺豹,可見一斑,GO語言將很多語言的優點內建到自身裡面,這也是為何在《【3】GO語言常量》中說到:“剛開始接觸GO,感覺它就是一個大雜燴,有很多語言的影子”的原因 :)
三、跳躍陳述式
聽 聽 使用迴圈時常伴隨著break、continue、goto關鍵字,是的,您沒有看錯,goto關鍵字在GO語言中得到了重用,早些年剛接觸編程時,有經驗的程式員總是諄諄教導:“能不用goto的就不要用goto”,所以很多語言總是在刻意迴避goto,但在惜關鍵字如金的GO語言中,goto又熠熠生輝起來。
下面使用goto關鍵字重寫1+2+3+4+……+100的迴圈例子:
先是定義了一個索引變數i和求和變數sum,然後定義了一個標籤MYBOWL(快到我的碗裡來),然後判斷索引變數i是否到了101,若沒有到則sum值就加i,再i++,然後再跳轉到MYBOWL;當條件不滿足之後(即i到了101)就輸出1到100的總和
【備忘】:
1、GO語言沒有++i,只有i++
還是那句話,GO語言認為一種方法能把問題解決就不用提供第二種方法了
2、標籤的範圍
上例中MYBOWL是一個標籤,它的範圍包括
if i < 101 {
聽 聽 sum += i
聽 聽 i++
聽 聽 goto MYBOWL
}
但不包括fmt.Println("sum=",sum),否則就會輸出100次"sum="
四、練習題
1、請問該程式的輸出結果是多少?
for {
聽 聽 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、請問該程式的輸出結果是多少?
MYBOWL:
聽 聽 for {
聽 聽 聽 聽 for i := 0; i < 5; i++ {
聽 聽 聽 聽 聽 聽 if i > 3 {
聽 聽 聽 聽 聽 聽 聽 聽 fmt.Println("i=", i)
break MYBOWL
聽 聽 聽 聽 聽 聽 }
聽 聽 聽 聽 }
聽 聽 }
該程式與程式2不同之外僅在於break語句
答案:
輸出i=4
原因是由於當i=4時條件陳述式滿足,輸出i=4後執行break語句,這裡的break後面添加了標籤MYBOWL,這也意味著是跳出MYBOWL標籤,而MYBOWL標籤是第一層迴圈,所以程式可以結束。
結束語:
要想熟悉一門語言,最重要的是用該語言寫應用程式,多寫就能多體會,熟能生巧 :)
本文出自 “青客” 部落格,請務必保留此出處http://qingkechina.blog.51cto.com/5552198/1618407