Go語言擁有三種類型的函數
我們使用函數將一個複雜的系統分解一系統簡單的任務,每個函數負責執行一個任務。而且每一個函數都可以被重複調用多次。
在Go語言裡,函數的基本組成為:
func func_name( <params> ) <return_type> {
//do something
}
Go語言支持函數有多返回值,可以在函數執行完畢後執行多個參數。順帶一提,在Go語言裡並沒有try、except語句,因此Go語言經常在函數的返回值裡最後一個參數當做錯誤指標,當錯誤指標非nil或false時代表函數執行過程發生錯誤。
舉例來說,我們想要查詢key是否在map裡頭
val, ok := map[key]
if ok!=false {
//key存在map裡,可以繼續執行…
}
在上述代碼裡,map[key]會返回兩個值,第一個是key對應的val,第二個是錯誤參數ok,我們可以透過參數ok是否為false來判斷該key是否存在於map裡頭。
Go語言的設計理念不希望工程師用try、except忽略可能發生異常的代碼,因此用這種錯誤返回參數的方式讓工程師必須提供妥善的錯誤處理。
Go語言支持在返回值處宣告返回值參數,返回值參數始值化為資料類型的默認值,數值為0,字串為空字串,布林值為false,指針為nil。
當返回值有宣告變數時,函數執行回畢時必須顯式的調用return。
舉個例子,我們在宣告函數時將返回值命名為x,y
func demoReturnVlaues() (x, y int){
x = 10 //宣告函數時已定義返回數參數,因此可以在函數體內直接使用
y = 20
return //必須要顯式調用return
}
如果我們在return語句也像一般函數給予返回參數是合法的。
func demoReturnVlaues() (x, y int){
x = 10
return a, 20
}
需要注意的是宣告函數時返回參數不能和返回類型的語法混用,會發生編釋錯誤,如下,
func demoReturnVlaues() (x, y int, float)
當我們不知道函數的傳入參數個數多少時,可以使用可變參數列表,讓函數接受任意個傳入參數。Go語言內建的fmt.Print函數就是可變參數函數的一個例子。
可變參數宣告時,必須在參數的資料型態前加上...,例如...int或...string,且可變參數必須是參數列表的最後一個參數。
例如,我們設計一個函數可以接收多個參數並回傳參數的總乘積。
func factorial(nums ...int){
total :=1
for _, num := range nums{
total *= num
}
return total
}
調用此函數的結果為
a := factorial(1,2) //a=3
b := factorial(2,3,4) //b=24