【Go語言】【9】GO語言的迴圈語句

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一、迴圈語句

聽 聽 迴圈語句即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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.