Go 系列教程 —— 6. 函數(Function)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。這是我們 [Golang 系列教程](/subject/2)第 6 章,學習 Golang 函數的相關知識。## 函數是什嗎?函數是一塊執行特定任務的代碼。一個函數是在輸入源基礎上,通過執行一系列的演算法,產生預期的輸出。## 函數的聲明在 Go 語言中,函式宣告通用文法如下:```gofunc functionname(parametername type) returntype { // 函數體(具體實現的功能)}```函數的聲明以關鍵詞 `func` 開始,後面緊跟自訂的函數名 `functionname (函數名)`。函數的參數列表定義在 `(` 和 `)` 之間,傳回值的類型則定義在之後的 `returntype (傳回值類型)`處。聲明一個參數的文法採用 **參數名** **參數類型** 的方式,任意多個參數採用類似 `(parameter1 type, parameter2 type) 即(參數1 參數1的類型,參數2 參數2的類型)`的形式指定。之後包含在 `{` 和 `}` 之間的代碼,就是函數體。函數中的參數列表和傳回值並非是必須的,所以下面這個函數的聲明也是有效```gofunc functionname() { // 譯註: 表示這個函數不需要輸入參數,且沒有傳回值}```## 樣本函數我們以寫一個計算商品價格的函數為例,輸入參數是單件商品的價格和商品的個數,兩者的乘積為商品總價,作為函數的輸出值。```gofunc calculateBill(price int, no int) int { var totalPrice = price * no // 商品總價 = 商品單價 * 數量 return totalPrice // 返回總價}```上述函數有兩個整型的輸入 `price` 和 `no`,傳回值 `totalPrice` 為 `price` 和 `no` 的乘積,也是整數類型。**如果有連續若干個參數,它們的類型一致,那麼我們無須一一羅列,只需在最後一個參數後添加該類型。** 例如,`price int, no int` 可以簡寫為 `price, no int`,所以樣本函數也可寫成```gofunc calculateBill(price, no int) int { var totalPrice = price * no return totalPrice}```現在我們已經定義了一個函數,我們要在代碼中嘗試著調用它。調用函數的文法為 `functionname(parameters)`。調用樣本函數的方法如下:```gocalculateBill(10, 5)```完成了樣本函式宣告和調用後,我們就能寫出一個完整的程式,並把商品總價列印在控制台上:```gopackage mainimport ( "fmt")func calculateBill(price, no int) int { var totalPrice = price * no return totalPrice}func main() { price, no := 90, 6 // 定義 price 和 no,預設類型為 int totalPrice := calculateBill(price, no) fmt.Println("Total price is", totalPrice) // 列印到控制台上}```[運行這個程式](https://play.golang.org/p/YJlW3g-VZH)該程式在控制台上列印的結果為```Total price is 540```## 多傳回值Go 語言支援一個函數可以有多個傳回值。我們來寫個以矩形的長和寬為輸入參數,計算並返回矩形面積和周長的函數 `rectProps`。矩形的面積是長度和寬度的乘積, 周長是長度和寬度之和的兩倍。即:- `面積 = 長 * 寬`- `周長 = 2 * ( 長 + 寬 )````gopackage mainimport ( "fmt")func rectProps(length, width float64)(float64, float64) { var area = length * width var perimeter = (length + width) * 2 return area, perimeter}func main() { area, perimeter := rectProps(10.8, 5.6) fmt.Printf("Area %f Perimeter %f", area, perimeter) }```[運行這個程式](https://play.golang.org/p/qAftE_yke_)如果一個函數有多個傳回值,那麼這些傳回值必須用 `(` 和 `)` 括起來。`func rectProps(length, width float64)(float64, float64)` 樣本函數有兩個 float64 類型的輸入參數 `length` 和 `width`,並返回兩個 float64 類型的值。該程式在控制台上列印結果為```Area 60.480000 Perimeter 32.800000```## 命名傳回值從函數中可以返回一個命名值。一旦命名了傳回值,可以認為這些值在函數第一行就被聲明為變數了。上面的 rectProps 函數也可用這個方式寫成:```gofunc rectProps(length, width float64)(area, perimeter float64) { area = length * width perimeter = (length + width) * 2 return // 不需要明確指定傳回值,預設返回 area, perimeter 的值}```請注意, 函數中的 return 語句沒有顯式返回任何值。由於 **area** 和 **perimeter** 在函式宣告中指定為傳回值, 因此當遇到 return 語句時, 它們將自動從函數返回。## 空白符**_** 在 Go 中被用作空白符,可以用作表示任何類型的任何值。我們繼續以 `rectProps` 函數為例,該Function Compute的是面積和周長。假使我們只需要計算面積,而並不關心周長的計算結果,該怎麼調用這個函數呢?這時,空白符 **_** 就上場了。下面的程式我們只用到了函數 `rectProps` 的一個傳回值 `area````gopackage mainimport ( "fmt")func rectProps(length, width float64) (float64, float64) { var area = length * width var perimeter = (length + width) * 2 return area, perimeter}func main() {    area, _ := rectProps(10.8, 5.6) // 傳回值周長被丟棄    fmt.Printf("Area %f ", area)}```[運行這個程式](https://play.golang.org/p/IkugSH1jIt)> 在程式的 `area, _ := rectProps(10.8, 5.6)` 這一行,我們看到空白符 `_` 用來跳過不要的計算結果。本章教程到此告一段落了,感謝您的閱讀,歡迎您的任何評論和反饋。**上一教程 - [常量](https://studygolang.com/articles/11872)****下一教程 - [包 (Packages)](https://studygolang.com/articles/11893)**

via: https://golangbot.com/functions/

作者:Nick Coghlan 譯者:Junedayday 校對:Unknwon polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

4285 次點擊  ∙  2 贊  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.