天天看點

Go語言基礎3 - 函數概述函數

概述

我們将用幾節來學習Go語言基礎,本文結構如下:

函數
    -多值傳回
    -可命名結果形參
    -Defer           

複制

函數

函數的基本語句結構:

func DoSome(a int ) string{
  return "do"
}           

複制

  • func 是關鍵字,表示函數的開始。
  • 參數的寫法是 變量名在前,類型在後。
  • 傳回值寫在函數的參數的括号後面,上面的例子傳回值是 string

多值傳回

函數和方法可傳回多個值:

func  Write(b []byte) (int, error)           

複制

上面的傳回值,聲明傳回的是 int, error 這兩個值。在一些需要傳回錯誤資訊的情況下會非常有用。

調用時,可以這麼使用:

r,e := Write()

使用 空白辨別符可以忽略第二個參數:

r,_ := Write()

可命名結果形參

函數的傳回值可被命名,并作為正常變量使用,就像傳入的形參一樣。 比如:

func nextInt(b []byte, pos int) (value, nextPos int) {           

複制

命名後,一旦該函數開始執行,它們就會被初始化為與其類型相應的零值;

若該函數執行了一條不帶實參的 return 語句,則結果形參的目前值将被傳回。

一個示例:

func ReadFull(r Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        buf = buf[nr:]
    }
    return
  }           

複制

Defer

defer 語句用于 預先認為某個函數被調用。也可了解為 推遲執行函數。被 defer 的 函數會在執行 defer 所屬于的函數傳回之前 “立即執行"。

例如無論以何種路徑傳回,都必須釋放資源的函數。 典型的例子就是關閉檔案:

func Contents(filename string) (string, error) {
    f, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer f.Close()  // f.Close 會在我們結束後運作。           

複制