C語言中文網 目錄
首頁 > Go語言教程 > Go語言函數 閱讀:7,630

Go語言函數聲明(函數定義)

普通函數需要先聲明才能調用。一個函數的聲明包括參數和函數名等,編譯器通過聲明才能了解函數應該怎樣在調用代碼和函數體之間傳遞參數和返回參數。

普通函數的聲明形式

Go 語言的函數聲明以 func 標識,后面緊接著函數名、參數列表、返回參數列表及函數體,具體形式如下:

func 函數名(參數列表)(返回參數列表){
    函數體
}


下面是對各個部分的說明:
  • 函數名:由字母、數字、下畫線組成。其中,函數名的第一個字母不能為數字。在同一個包內,函數名稱不能重名。
    包(package)是 Go 源碼的一種組織方式,一個包可以認為是一個文件夾,在后續章節中將會詳細講解包的概念。
  • 參數列表:一個參數由參數變量和參數類型組成,例如:
    func foo( a int, b string )
    其中,參數列表中的變量作為函數的局部變量而存在。
  • 返回參數列表:可以是返回值類型列表,也可以是類似參數列表中變量名和類型名的組合。函數在聲明有返回值時,必須在函數體中使用 return 語句提供返回值列表。
  • 函數體:能夠被重復調用的代碼片段。

參數類型的簡寫

在參數列表中,如有多個參數變量,則以逗號分隔;如果相鄰變量是同類型,則可以將類型省略。例如:
func add(a, b int) int {
    return a + b
}
以上代碼中,a 和 b 的參數均為 int 類型,因此可以省略 a 的類型,在 b 后面有類型說明,這個類型也是 a 的類型。

函數的返回值

Go 語言支持多返回值,多返回值能方便地獲得函數執行后的多個返回參數,Go 語言經常使用多返回值中的最后一個返回參數返回函數執行中可能發生的錯誤。示例代碼如下:
conn, err := connectToNetwork()
在這段代碼中,connectToNetwork 返回兩個參數,conn 表示連接對象,err 返回錯誤。

其它編程語言中函數的返回值

  • C/C++ 語言中只支持一個返回值,在需要返回多個數值時,則需要使用結構體返回結果,或者在參數中使用指針變量,然后在函數內部修改外部傳入的變量值,實現返回計算結果。C++ 語言中為了安全性,建議在參數返回數據時使用“引用”替代指針。
  • C# 語言也沒有多返回值特性。C# 語言后期加入的 ref 和 out 關鍵字能夠通過函數的調用參數獲得函數體中修改的數據。
  • lua 語言沒有指針,但支持多返回值,在大塊數據使用時方便很多。

Go 語言既支持安全指針,也支持多返回值,因此在使用函數進行邏輯編寫時更為方便。

1) 同一種類型返回值

如果返回值是同一種類型,則用括號將多個返回值類型括起來,用逗號分隔每個返回值的類型。

使用 return 語句返回時,值列表的順序需要與函數聲明的返回值類型一致。示例代碼如下:
func typedTwoValues() (int, int) {

    return 1, 2
}

a, b := typedTwoValues()
fmt.Println(a, b)
代碼輸出結果:
1 2

純類型的返回值對于代碼可讀性不是很友好,特別是在同類型的返回值出現時,無法區分每個返回參數的意義。

2) 帶有變量名的返回值

Go 語言支持對返回值進行命名,這樣返回值就和參數一樣擁有參數變量名和類型。

命名的返回值變量的默認值為類型的默認值,即數值為 0,字符串為空字符串,布爾為 false、指針為 nil 等。

下面代碼中的函數擁有兩個整型返回值,函數聲明時將返回值命名為 a 和 b,因此可以在函數體中直接對函數返回值進行賦值。在命名的返回值方式的函數體中,在函數結束前需要顯式地使用 return 語句進行返回,代碼如下:
func namedRetValues() (a, b int) {

    a = 1
    b = 2

    return
}
代碼說明如下:
  • 第 1 行,對兩個整型返回值進行命名,分別為 a 和 b。
  • 第 3 行和第 4 行,命名返回值的變量與這個函數的布局變量的效果一致,可以對返回值進行賦值和值獲取。
  • 第 6 行,當函數使用命名返回值時,可以在 return 中不填寫返回值列表,如果填寫也是可行的。下面代碼的執行效果和上面代碼的效果一樣。
    func namedRetValues() (a, b int) {
        a = 1
    
        return a, 2
    }

提示

同一種類型返回值和命名返回值兩種形式只能二選一,混用時將會發生編譯錯誤,例如下面的代碼:
func namedRetValues() (a, b int, int)
編譯報錯提示:

mixed named and unnamed function parameters

意思是:在函數參數中混合使用了命名和非命名參數。

調用函數

函數在定義后,可以通過調用的方式,讓當前代碼跳轉到被調用的函數中進行執行。調用前的函數局部變量都會被保存起來不會丟失;被調用的函數結束后,恢復到被調用函數的下一行繼續執行代碼,之前的局部變量也能繼續訪問。

函數內的局部變量只能在函數體中使用,函數調用結束后,這些局部變量都會被釋放并且失效。

Go語言的函數調用格式如下:

返回值變量列表 = 函數名(參數列表)


下面是對各個部分的說明:
  • 函數名:需要調用的函數名。
  • 參數列表:參數變量以逗號分隔,尾部無須以分號結尾。
  • 返回值變量列表:多個返回值使用逗號分隔。

例如,加法函數調用樣式如下:

result := add(1,1)

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo