在 Go 語言中,函數聲明通用語法以下:函數
func functionname(parametername type) returntype { // 函數體(具體實現的功能) }
函數的聲明以關鍵詞 func
開始,後面緊跟自定義的函數名 functionname (函數名)
。函數的參數列表定義在 (
和 )
之間,返回值的類型則定義在以後的 returntype (返回值類型)
處。聲明一個參數的語法採用 參數名 參數類型 的方式,任意多個參數採用相似 (parameter1 type, parameter2 type) 即(參數1 參數1的類型,參數2 參數2的類型)
的形式指定。以後包含在 {
和 }
之間的代碼,就是函數體。spa
函數中的參數列表和返回值並不是是必須的,因此下面這個函數的聲明也是有效的code
func functionname() { // 譯註: 表示這個函數不須要輸入參數,且沒有返回值 }
package main import "fmt" //傳入單個參數 func functionname1(parametername int){ fmt.Printf("參數:%d\n",parametername); } //傳入單個參數,單個返回值 func functionname2(parametername int) int{ fmt.Printf("參數:%d\n",parametername); return parametername*parametername; } //傳入多個參數 func functionname3(parametername1 int,parametername2 int){ fmt.Printf("參數1:%d\n",parametername1); fmt.Printf("參數2:%d\n",parametername2); } //傳入多個參數,多個返回值 func functionname4(parametername1 int,parametername2 int)(int,int){ fmt.Printf("參數1:%d\n",parametername1); fmt.Printf("參數2:%d\n",parametername2); return parametername1*parametername2,parametername1+parametername2; } func main(){ a := 1; b := 2; functionname1(a); functionname2(a); functionname3(a,b); functionname4(a,b); }
從函數中能夠返回一個命名值。一旦命名了返回值,能夠認爲這些值在函數第一行就被聲明爲變量了。blog
上面的 rectProps 函數也可用這個方式寫成:教程
func rectProps(length, width float64)(area, perimeter float64) { area = length * width perimeter = (length + width) * 2 return // 不須要明確指定返回值,默認返回 area, perimeter 的值 }
請注意, 函數中的 return 語句沒有顯式返回任何值。因爲 area 和 perimeter 在函數聲明中指定爲返回值, 所以當遇到 return 語句時, 它們將自動從函數返回。get
以程序導入gotest/even包爲例 package main import ( "even" "fmt" ) func main() { i:=even.I fmt.Printf("Is %d even? %v\n", i, even.Even(i)) } package even var I int = 123 func Even(i int) bool { return i%2==0 } func odd(i int) bool { return i%2!=0 } 1.本地包 even 在這裏導入; 2. 官方 fmt 包導入; 3.調用 even 包中的函數。訪問一個包中的函數的語法是 <package>.Function(),變量 <package>.Var。 在 Go 中,當變量或函數的首字母大寫的時候,函數會被從包中導出(在包外部可見,或者說公有的),所以函數名是 Even。若是修改main.go 的第 10 行,使用未導出的函數 even.odd: fmt.Printf("Is %d even? %v\n", i, even.odd(i)) 因爲使用了私有的函數,會獲得一個編譯錯誤: main.go:10: cannot refer to unexported name even.odd 歸納來講: 公有函數的名字以大寫字母開頭; 私有函數的名字以小寫字母開頭。
_ 在 Go 中被用做空白符,能夠用做表示任何類型的任何值。io
咱們繼續以 rectProps
函數爲例,該函數計算的是面積和周長。假使咱們只須要計算面積,而並不關心周長的計算結果,該怎麼調用這個函數呢?這時,空白符 _ 就上場了。編譯
下面的程序咱們只用到了函數 rectProps
的一個返回值 area
function
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) }
運行這個程序class
在程序的
area, _ := rectProps(10.8, 5.6)
這一行,咱們看到空白符_
用來跳過不要的計算結果。
『GCTT 出品』Go 系列教程 —— 6. 函數(Function)
refer: