Go語言學習筆記(三) [控制結構、內建函數]
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。日期:2014年7月21日
一、控制結構
1、Go中,只有幾個控制結構,它沒有do或者while迴圈,有for,靈活的switch語句和if,在switch中可以接受像for那樣可選的初始化語句,另外Go中還提供了類型選擇和多路通訊轉接器的select。Go的控制結構的文法和C相比有所不同,它不需要圓括弧,但語句體必須總是包含在大括弧內。
2、控制結構文法1)if-else (1)if後緊跟單個條件 例如:if x > 0 { //{必須和if在同一行,這是Go文法規定的,如果換行寫,編譯就會報錯 return y } else { return x } (2)if後接受初始化語句 例如: m1:=7 if n1:=9; n1 >= m1 { fmt.Print("n1 >= m1") } (3)if後緊跟邏輯運算子 例如:if true && true { fmt.Println("true") } if語句體中,語句體結束於break、continue、goto、return,這和其它語言沒什麼區別。
2)goto Go中支援goto語句,不過使用的時候要多加小心。 例如: func gotodemo() (string){ i := 0 GoToHere: //這是函數內定義的標籤,注意,它是區分大小寫。 if i >= 5 { return "OK" } fmt.Println(i) i++ goto GoToHere //goto跳轉至函數定義的標籤處 }
3)for Go語言中,for控制結構的功能相對來說較為強大,它可以完成C語言中for的功能,也能完成while的功能,當然我並不知道這門語言的設計者為什麼要改變我們在其它語言中的通用性的使用習慣,但我覺得我喜歡這種風格,少即是多,如果能通過一個關鍵字來實現多種效果,又何必多增加一個關鍵字呢?Google對Go語言的設計思路和其本身遵從“更少點=簡單”的理念是一致的。 for迴圈的三種形式: (1)for init ; condition ; post {} //同C中的for (2)for condition {} //同while (3)for {} //死迴圈
4)break和continue break用來終止迴圈,continue用來終止當前迴圈 例如: func breakdemo() { for i := 0; i < 10 ; i++ { if i > 5 { break //整個迴圈終止 } fmt.Println(i) } Tag:for i := 0; i < 10 ; i++ { if i > 10 { break Tag //終止標籤名為Tag的迴圈 } fmt.Println(i) } } func continuedemo() { for i := 0; i < 10 ; i++ { if i == 2 { continue fmt.Println("after continue") //不會執行 } fmt.Println("continue") } }
5)rangerange可以用於迴圈,range 是個迭代器,當被調用的時候,從它迴圈的內容中返回一個索引值對,基於 不同的內容,range 返回不同的東西。例如: func rangedemo() { list := [] string { "a", "b", "c" } for k, v := range list { //用 range 對其進行迴圈。每一個迭代,range 將返回 int 類型的序號,string 類型的值 fmt.Print("k=") fmt.Println(k) fmt.Print("v=") fmt.Println(v) } }列印:k=0v=ak=1v=bk=2v=c當對 slice 或者 array 做迴圈時,range 返回序號作為鍵,這個序號對應的內容作為值。 上述迴圈中k值變化範圍是0~2,v值的變化範圍是"a"~"c"。
range還可以直接使用在字串的遍曆中,字串被打散成獨立的Unicode字元,例如: for pos,char := range "abcd" { fmt.Printf("character '%c' starts at byte position %d\n",char, pos) }列印:character 'a' starts at byte position 0character 'b' starts at byte position 1character 'c' starts at byte position 2character 'd' starts at byte position 3
6)switchGo的switch非常靈活,運算式不必是常量或整數,執行的過程從上至下,直到找 到匹配項,而如果 switch 沒有運算式,它會匹配 true 。例如: func switchdemo() { len := 4 switch len { case 0: println("len=0") case 1: println("len=1") fallthrough case 2: println("len=2") case 3,4: println("len=3 or len=4") default: println("default") } }現在,我們來對switch中len的值來進行分析:(1)假如len := 0,列印結果:len=0(2)假如len := 1,列印結果:len=1 len=2 為什麼不滿足的case 2,也會執行呢?這是因為我們使用了fallthrough關鍵字,它會強制case 2中的語句得以執行。(3)假如len := 3或len := 4,列印結果len=3 or len=4,case中多個條件的判斷使用","隔開,各個條件之間的關係是"OR"的關係。(4)假如len不是0~4中任何一個值,那麼就會執行default條件中的語句,列印出:default。
二、內建函數
在Go中提供了少數內建函數,它們可以在不用匯入任何包的情形下使用,中列出了Go中的內建函數:
內建函數的用途簡介:close :用於 channel 通訊。使用它來關閉 channel。 delete :用於在 map 中刪除執行個體。 len 和 cap :可用於不同的類型,len 用於返回字串、slice 和數組的長度。new :用於各種類型的記憶體配置。make :用於內建類型(map、slice 和 channel)的記憶體配置。copy :用於複製 slice。參閱本章的 “slice”。 append :用於追加 slice。參閱本章的 “slice”。 panic 和 recover :用於異常處理機制。print 和 println :是底層列印函數,可以在不引入 fmt 包的情況下使用。它們主要用於調試。 complex、real 和 imag :全部用於處理 複數。有了之前給的簡單的例子,不用再進一步討論複數了。