Go語言學習筆記(三) [控制結構、內建函數]

日期: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)range
range可以用於循環,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=0
v=a
k=1
v=b
k=2
v=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 0
character 'b' starts at byte position 1
character 'c' starts at byte position 2
character 'd' starts at byte position 3
 
6)switch
Go的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 :全部用於處理 複數。有了之前給的簡單的例子,不用再進一步討論複數了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章