Go 經(jīng)典入門系列 6:函數(shù)
這是我們 Golang 系列教程第 6 章,學(xué)習(xí) Golang 函數(shù)的相關(guān)知識。
函數(shù)是什么?
函數(shù)是一塊執(zhí)行特定任務(wù)的代碼。一個(gè)函數(shù)是在輸入源基礎(chǔ)上,通過執(zhí)行一系列的算法,生成預(yù)期的輸出。
函數(shù)的聲明
在 Go 語言中,函數(shù)聲明通用語法如下:
func?functionname(parametername?type)?returntype?{
????//?函數(shù)體(具體實(shí)現(xiàn)的功能)
}
函數(shù)的聲明以關(guān)鍵詞 func 開始,后面緊跟自定義的函數(shù)名 functionname (函數(shù)名)。函數(shù)的參數(shù)列表定義在 ( 和 ) 之間,返回值的類型則定義在之后的 returntype (返回值類型)處。聲明一個(gè)參數(shù)的語法采用 參數(shù)名 參數(shù)類型 的方式,任意多個(gè)參數(shù)采用類似 (parameter1 type, parameter2 type) 即(參數(shù)1 參數(shù)1的類型,參數(shù)2 參數(shù)2的類型)的形式指定。之后包含在 { 和 } 之間的代碼,就是函數(shù)體。
函數(shù)中的參數(shù)列表和返回值并非是必須的,所以下面這個(gè)函數(shù)的聲明也是有效的
func?functionname()?{
?//?譯注:?表示這個(gè)函數(shù)不需要輸入?yún)?shù),且沒有返回值
}
示例函數(shù)
我們以寫一個(gè)計(jì)算商品價(jià)格的函數(shù)為例,輸入?yún)?shù)是單件商品的價(jià)格和商品的個(gè)數(shù),兩者的乘積為商品總價(jià),作為函數(shù)的輸出值。
func?calculateBill(price?int,?no?int)?int?{
????var?totalPrice?=?price?*?no?//?商品總價(jià)?=?商品單價(jià)?*?數(shù)量
????return?totalPrice?//?返回總價(jià)
}
上述函數(shù)有兩個(gè)整型的輸入 price 和 no,返回值 totalPrice 為 price 和 no 的乘積,也是整數(shù)類型。
如果有連續(xù)若干個(gè)參數(shù),它們的類型一致,那么我們無須一一羅列,只需在最后一個(gè)參數(shù)后添加該類型。 例如,price int, no int 可以簡寫為 price, no int,所以示例函數(shù)也可寫成
func?calculateBill(price,?no?int)?int?{
????var?totalPrice?=?price?*?no
????return?totalPrice
}
現(xiàn)在我們已經(jīng)定義了一個(gè)函數(shù),我們要在代碼中嘗試著調(diào)用它。調(diào)用函數(shù)的語法為 functionname(parameters)。調(diào)用示例函數(shù)的方法如下:
calculateBill(10,?5)
完成了示例函數(shù)聲明和調(diào)用后,我們就能寫出一個(gè)完整的程序,并把商品總價(jià)打印在控制臺上:
package?main
import?(
????"fmt"
)
func?calculateBill(price,?no?int)?int?{
????var?totalPrice?=?price?*?no
????return?totalPrice
}
func?main()?{
????price,?no?:=?90,?6?//?定義?price?和?no,默認(rèn)類型為?int
????totalPrice?:=?calculateBill(price,?no)
????fmt.Println("Total?price?is",?totalPrice)?//?打印到控制臺上
}
運(yùn)行這個(gè)程序[1]
該程序在控制臺上打印的結(jié)果為
Total?price?is?540
多返回值
Go 語言支持一個(gè)函數(shù)可以有多個(gè)返回值。我們來寫個(gè)以矩形的長和寬為輸入?yún)?shù),計(jì)算并返回矩形面積和周長的函數(shù) rectProps。矩形的面積是長度和寬度的乘積, 周長是長度和寬度之和的兩倍。即:
面積 = 長 * 寬周長 = 2 * ( 長 + 寬 )
package?main
import?(
????"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)
}
運(yùn)行這個(gè)程序[2]
如果一個(gè)函數(shù)有多個(gè)返回值,那么這些返回值必須用 ( 和 ) 括起來。func rectProps(length, width float64)(float64, float64) 示例函數(shù)有兩個(gè) float64 類型的輸入?yún)?shù) length 和 width,并返回兩個(gè) float64 類型的值。該程序在控制臺上打印結(jié)果為
Area?60.480000?Perimeter?32.800000
命名返回值
從函數(shù)中可以返回一個(gè)命名值。一旦命名了返回值,可以認(rèn)為這些值在函數(shù)第一行就被聲明為變量了。
上面的 rectProps 函數(shù)也可用這個(gè)方式寫成:
func?rectProps(length,?width?float64)(area,?perimeter?float64)?{
????area?=?length?*?width
????perimeter?=?(length?+?width)?*?2
????return?//?不需要明確指定返回值,默認(rèn)返回?area,?perimeter?的值
}
請注意, 函數(shù)中的 return 語句沒有顯式返回任何值。由于 area 和 perimeter 在函數(shù)聲明中指定為返回值, 因此當(dāng)遇到 return 語句時(shí), 它們將自動從函數(shù)返回。
空白符
_ 在 Go 中被用作空白符,可以用作表示任何類型的任何值。
我們繼續(xù)以 rectProps 函數(shù)為例,該函數(shù)計(jì)算的是面積和周長。假使我們只需要計(jì)算面積,而并不關(guān)心周長的計(jì)算結(jié)果,該怎么調(diào)用這個(gè)函數(shù)呢?這時(shí),空白符 _ 就上場了。
下面的程序我們只用到了函數(shù) rectProps 的一個(gè)返回值 area
package?main
import?(
????"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)
}
運(yùn)行這個(gè)程序[3]
在程序的
area, _ := rectProps(10.8, 5.6)這一行,我們看到空白符_用來跳過不要的計(jì)算結(jié)果。
本章教程到此告一段落了,感謝您的閱讀,歡迎您的任何評論和反饋。
下一教程 - 包 (Packages)[4]
via: https://golangbot.com/functions/
作者:Nick Coghlan[5]譯者:Junedayday[6]校對:Unknwon[7]、polaris1119[8]
本文由 GCTT[9] 原創(chuàng)編譯,Go 中文網(wǎng)[10] 榮譽(yù)推出
參考資料
運(yùn)行這個(gè)程序: https://play.golang.org/p/YJlW3g-VZH
[2]運(yùn)行這個(gè)程序: https://play.golang.org/p/qAftE_yke_
[3]運(yùn)行這個(gè)程序: https://play.golang.org/p/IkugSH1jIt
[4]包 (Packages): https://studygolang.com/articles/11893
[5]Nick Coghlan: https://golangbot.com/about/
[6]Junedayday: https://github.com/Junedayday
[7]Unknwon: https://github.com/Unknwon
[8]polaris1119: https://github.com/polaris1119
[9]GCTT: https://github.com/studygolang/GCTT
[10]Go 中文網(wǎng): https://studygolang.com/
推薦閱讀
