W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
原文鏈接:https://gopl-zh.github.io/ch5/ch5-01.html
函數(shù)聲明包括函數(shù)名、形式參數(shù)列表、返回值列表(可省略)以及函數(shù)體。
func name(parameter-list) (result-list) {
body
}
形式參數(shù)列表描述了函數(shù)的參數(shù)名以及參數(shù)類型。這些參數(shù)作為局部變量,其值由參數(shù)調(diào)用者提供。返回值列表描述了函數(shù)返回值的變量名以及類型。如果函數(shù)返回一個無名變量或者沒有返回值,返回值列表的括號是可以省略的。如果一個函數(shù)聲明不包括返回值列表,那么函數(shù)體執(zhí)行完畢后,不會返回任何值。在hypot函數(shù)中:
func hypot(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3,4)) // "5"
x和y是形參名,3和4是調(diào)用時的傳入的實參,函數(shù)返回了一個float64類型的值。 返回值也可以像形式參數(shù)一樣被命名。在這種情況下,每個返回值被聲明成一個局部變量,并根據(jù)該返回值的類型,將其初始化為該類型的零值。 如果一個函數(shù)在聲明時,包含返回值列表,該函數(shù)必須以 return語句結(jié)尾,除非函數(shù)明顯無法運行到結(jié)尾處。例如函數(shù)在結(jié)尾時調(diào)用了panic異?;蚝瘮?shù)中存在無限循環(huán)。
正如hypot一樣,如果一組形參或返回值有相同的類型,我們不必為每個形參都寫出參數(shù)類型。下面2個聲明是等價的:
func f(i, j, k int, s, t string) { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... */ }
下面,我們給出4種方法聲明擁有2個int型參數(shù)和1個int型返回值的函數(shù).blank identifier(譯者注:即下文的_符號)可以強調(diào)某個參數(shù)未被使用。
func add(x int, y int) int {return x + y}
func sub(x, y int) (z int) { z = x - y; return}
func first(x int, _ int) int { return x }
func zero(int, int) int { return 0 }
fmt.Printf("%T\n", add) // "func(int, int) int"
fmt.Printf("%T\n", sub) // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero) // "func(int, int) int"
函數(shù)的類型被稱為函數(shù)的簽名。如果兩個函數(shù)形式參數(shù)列表和返回值列表中的變量類型一一對應(yīng),那么這兩個函數(shù)被認(rèn)為有相同的類型或簽名。形參和返回值的變量名不影響函數(shù)簽名,也不影響它們是否可以以省略參數(shù)類型的形式表示。
每一次函數(shù)調(diào)用都必須按照聲明順序為所有參數(shù)提供實參(參數(shù)值)。在函數(shù)調(diào)用時,Go語言沒有默認(rèn)參數(shù)值,也沒有任何方法可以通過參數(shù)名指定形參,因此形參和返回值的變量名對于函數(shù)調(diào)用者而言沒有意義。
在函數(shù)體中,函數(shù)的形參作為局部變量,被初始化為調(diào)用者提供的值。函數(shù)的形參和有名返回值作為函數(shù)最外層的局部變量,被存儲在相同的詞法塊中。
實參通過值的方式傳遞,因此函數(shù)的形參是實參的拷貝。對形參進行修改不會影響實參。但是,如果實參包括引用類型,如指針,slice(切片)、map、function、channel等類型,實參可能會由于函數(shù)的間接引用被修改。
你可能會偶爾遇到?jīng)]有函數(shù)體的函數(shù)聲明,這表示該函數(shù)不是以Go實現(xiàn)的。這樣的聲明定義了函數(shù)簽名。
package math
func Sin(x float64) float //implemented in assembly language
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: