函數(shù) 是基于功能或邏輯進(jìn)行封裝的可復(fù)用的代碼結(jié)構(gòu),。將一段功能復(fù)雜,、很長(zhǎng)的一段代碼封裝成多個(gè)代碼片段(即函數(shù)),有助于提高代碼可讀性和可維護(hù)性,。由于 Go 語(yǔ)言是編譯型語(yǔ)言,,所以函數(shù)編寫的順序是無(wú)關(guān)緊要的。
在 Go 語(yǔ)言中,,函數(shù)聲明語(yǔ)法如下:
func function_name(parameter_list) (result_list) {
body
}
函數(shù)的聲明使用 func
關(guān)鍵詞,,后面依次接 function_name(函數(shù)名)
, parameter_list(參數(shù)列表)
,, result_list(返回值列表)
以及 函數(shù)體
。
- 形式參數(shù)列表描述了函數(shù)的參數(shù)名以及參數(shù)類型,,這些參數(shù)作為局部變量,,其值由參數(shù)調(diào)用者提供,函數(shù)中的參數(shù)列表和返回值并非是必須的,。
- 返回值列表描述了函數(shù)返回值的變量名以及類型,,如果函數(shù)返回一個(gè)無(wú)名變量或者沒有返回值,,返回值列表的括號(hào)是可以省略的。
- 如果有連續(xù)若干個(gè)參數(shù)的類型一致,,那么只需在最后一個(gè)參數(shù)后添加該類型,。
package main
import "fmt"
// 函數(shù)返回一個(gè)無(wú)名變量,返回值列表的括號(hào)省略
func sum(x int, y int) int {
return x + y
}
// 無(wú)參數(shù)列表和返回值
func printHello() {
fmt.Println("Hello")
}
// 參數(shù)的類型一致,,只在最后一個(gè)參數(shù)后添加該類型
func sub(x , y int) int {
return x - y
}
func main() {
fmt.Println("3 + 4 =", sum(3, 4))
printHello()
fmt.Println("5 - 2 =", sub(5, 2))
}
運(yùn)行該程序輸出如下:
3 + 4 = 7
Hello
5 - 2 = 3
上面的程序參數(shù)個(gè)數(shù)都是固定的,,在 Go 中我們也能像 Python 中一樣實(shí)現(xiàn)可變參數(shù)的函數(shù)。
多個(gè)類型一致的參數(shù)
在參數(shù)類型前面加 ...
表示一個(gè)切片,,用來(lái)接收調(diào)用者傳入的參數(shù),。注意,如果該函數(shù)下有其他類型的參數(shù),,這些其他參數(shù)必須放在參數(shù)列表的前面,,切片必須放在最后。
package main
import "fmt"
func sum(args ...int) int {
sum := 0
for _,x := range args{
sum += x
}
return sum
}
func main() {
fmt.Println(sum(3, 4, 5, 6, 7)) // 25
}
多個(gè)類型不一致的參數(shù)
如果傳多個(gè)參數(shù)的類型都不一樣,,可以指定類型為 ...interface{}
,,然后再遍歷。
package main
import "fmt"
func PrintType(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "type is int.")
case string:
fmt.Println(arg, "type is string.")
case float64:
fmt.Println(arg, "type is float64.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
func main() {
PrintType(1, 3.14, "abc")
}
運(yùn)行上面的程序輸出如下:
1 type is int.
3.14 type is float64.
abc type is string.
使用 ...
可以用來(lái)解序列,,能將函數(shù)的可變參數(shù)(即切片)一個(gè)一個(gè)取出來(lái),,傳遞給另一個(gè)可變參數(shù)的函數(shù),而不是傳遞可變參數(shù)變量本身,。
package main
import "fmt"
func sum(args ...int) int {
res := 0
for _,value := range args {
res += value
}
return res
}
func Sum(args ...int) int {
return sum(args...)
}
func main() {
fmt.Println(Sum(4, 5, 6)) // 15
}
當(dāng)函數(shù)沒有返回值時(shí),,函數(shù)體可以使用 return
語(yǔ)句返回,。在 Go 中一個(gè)函數(shù)可以返回多個(gè)值,。
package main
import "fmt"
func RectInfo(len, width int) (int, int) {
per := 2 * (len + width)
area := len * width
return area, per
}
func main() {
area, perimeter := RectInfo(10, 5)
fmt.Printf("area = %d, perimeter = %d", area, perimeter)
}
運(yùn)行該程序輸出如下:
area = 50, perimeter = 30
當(dāng)然,在 Go 中支持返回帶有變量名的值,??梢詫⑸厦娴暮瘮?shù)修改如下:
func RectInfo(len, width int) (area int, perimeter int) {
// 不使用 := 因?yàn)橐呀?jīng)在返回值那里聲明了
area = len * width
perimeter = 2 * (len + width)
// 直接返回即可
return
}
沒有名字的函數(shù)就叫 匿名函數(shù) ,,它只有函數(shù)邏輯體,而沒有函數(shù)名,。匿名函數(shù)只擁有短暫的生命,,一般都是定義后立即使用。
func (parameter_list) (result_list) {
body
}
參考文獻(xiàn):
[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序設(shè)計(jì)語(yǔ)言, Translated by 李道兵, 高博, 龐向才, 金鑫鑫 and 林齊斌, 機(jī)械工業(yè)出版社, 2017.