Go函數的特性
不支持:嵌套尽棕、函數重載喳挑、默認值參數
支持:可變變參、多返回值滔悉、命名返回值參數伊诵、匿名函數、閉包
特別注意:函數可以作為一種類型使用
1.1回官、函數定義
func name(parameter-list)(result-list) {
body
}
1.2可變參數函數
可變參數函數就是指函數的最后一個參數可以接受任意個參數曹宴。這類函數在最后一個 參數的類型前面添加有一個省略號"..."。在函數里面這個參數實質上變成了一個對應參數類型的切片孙乖。
func Minimumint(first int, rest ...int) int {
for _, x := range rest {
if x < first
first = x
}
return first
}
1.3多返回值函數
Go語言支持一個函數能夠返回多個結果浙炼。
func findLinks(url string) ([]stning, error) {
//func body
return links, err
}
調用一個多返回值函數,如果調用者要使用這些返回值唯袄,則必須顯式地將返回值賦給變量弯屈。
如:links, err := findLinks(url)
忽略其中一個返回值可以將它賦給一個空標識符。
如:links, _:= findLinks(url) // 忽略錯誤信息
返回一個多值結果可以是調用另一個多值返回的函數:
func findLinksLog(url string) ([]string, error) {
log.Printf("findLinks %s", url)
return findLinks(url)
}
1.4命名返回值參數
Go語言支持返回參數想入參一樣進行命名恋拷,命名后的返回參數可用作為函數的局部變量使用资厉,并且可用使用return直接返回。
func f(a, b, c int) (x, y, z int) {
x = a * b
y = b * c
z = c * a
return //不需要指定返回的變量
}
1.5 init()函數和 main()函數
Go語言為特定目的保留了兩個函數名:init()函數(可以出現在任何的包里)和main () 函數(只在main包里)蔬顾。這兩個函數既不可接收任何參數宴偿,也不返回任何結果湘捎。
init ()函數和main ()函數是自動執(zhí)行的,所以我們不應該顯式調用它們窄刘。
Go程序的啟動順序
Go程序的初始化和執(zhí)行總是從main包開始窥妇;
如果main包里導入了其他的包,則會按順序將它們包含進main包里娩践;
一個包實際上只會被導入 —次活翩,當一個 包被導入時,如果它自己還導入了其他的包翻伺,則還是先將其他的包導入進來材泄,然后再創(chuàng)建這個 包的一些常量和變量。
后續(xù)就是調用init()函數了(如果有多個就調用多次)吨岭,最終所有的 包都會被導入到main包里(包括這些包所導入的包等)拉宗,此時main這個包的常量和變量也會 被創(chuàng)建,init()函數會被執(zhí)行(如果有或者多個的話)辣辫;
最后旦事,main包里的main()函數會被執(zhí)行,程序開始運行络它。
啟動過程參考下圖:
1.6無函數體函數聲明
在Go的應用中族檬,有可能會看到有些函數的聲明沒有函數體,說明該函數使用了Go以外的語言實現化戳,這樣的聲明定義了函數簽名单料。
func Sin(x float64) float64 //使用匯編語言實現