go語言入門(流程控制,函數,錯誤處理)


  • 條件語句

if a<5 {
  todo()
}
else {
}
注意以下幾點:
  1. 條件語句不需要使用括號將條件包含起來 () ;
  2. 無論語句體內有幾條語句,花括號 {} 都是必須存在的;
  3. 左花括號 { 必須與 if 或者 else 處於同一行;
  4. 在 if 之後,條件語句之前,可以添加變量初始化語句,使用 ; 間隔;
  5. 在有返回值的函數中,不允許將“最終的” return 語句包含在 if…else… 結構中,
    否則會編譯失敗:如下函數體內的if - else會失敗:
func example(x int) int {
    if x == 0 {
        return 5
    } else {
        return x    //失敗
    }
}
  • 選擇語句
switch i {
    case 0:
        fmt.Printf("0")
    case 1:
        fmt.Printf("1")
    case 2:
        fallthrough
    case 3:
        fmt.Printf("3")
    case 4, 5, 6:
        fmt.Printf("4, 5, 6")
    default:
        fmt.Printf("Default")
}

注意以下幾點:
1. 左花括號 { 必須與 switch 處於同一行;
2. 條件表達式不限制爲常量或者整數;
3. 單個 case 中,可以出現多個結果選項;
4. 與C語言等規則相反,Go語言不需要用 break 來明確退出一個 case ;
5. 有在 case 中明確添加 fallthrough 關鍵字,纔會繼續執行緊跟的下一個 case ;
6. 可 以 不 設 定 switch 之 後 的 條 件 表 達 式 , 在 此 種 情 況 下 , 整 個 switch 結 構 與 多 個
if…else… 的邏輯作用等同。

  • 循環語句
    go只支持for循環語句

  • 函數

    關鍵字func 函數名 參數列表 返回值 函數體和返回語句

    小寫字母開頭的函數只在本包內可見,大寫開頭的函數才能被其他包使用

func Add(a int,b int)(ret int, err error){
    if a < 0 || b < 0{
        err= errors.New("Should be non-negative numbers!")
        return
    }
    return a+b,nil
}


  • 匿名函數與閉包

在Go裏面,函數可以像普通變量一樣被傳遞或使用,這與C語言的回調函數比較類似。不同的是,Go語言支持隨時在代碼裏定義匿名函數。匿名函數由一個不帶函數名的函數聲明和函數體組成,如下所示:
// 定義一個匿名函數
func (a,b int,z float64)bool {
    return a*b < int(z);
}

//匿名函數可以直接賦給一個變量或者直接執行
f := func(x,y int)int {
    return x+y
}
  • 閉包

    基本概念:閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者
    任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變量包含
    在代碼塊中,所以這些自由變量以及它們引用的對象沒有被釋放)爲自由變量提供綁定的計算環
    境(作用域)。

    閉包的價值:閉包的價值在於可以作爲函數對象或者匿名函數,對於類型系統而言,這意味着不僅要表示
    數據還要表示代碼。支持閉包的多數語言都將函數作爲第一級對象,就是說這些函數可以存儲到
    變量中作爲參數傳遞給其他函數,最重要的是能夠被函數動態創建和返回。

  • 錯誤處理

    1. error接口

    2. defer

      • 執行方式類似於c++中的析構函數,在函數體執行結束按照調用順序的相反順序逐個執行
      • 即使函數發生嚴重錯誤也會執行
      • 支持匿名函數的調用
      • 常用於資源的清理,文件關閉,解鎖以及記錄時間等操作
      • 通過與匿名函數配合可以在return之後修改函數計算結果
      • 如果函數體內某個變量作爲defer時匿名函數的參數,則在定義defer時已經獲得拷貝,否則則是引用某個變量的地址
  1. panic()和recover()
    Panic可以在任何地方引發,但recover只有在defer調用的函數中有效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章