函數聲明包括函數名,形參列表,返回值列表(可選),函數體組成函數
func test(parameters) (returns) { // ... }
其中 parameters 就是函數的形參列表,描述了函數的參數名和參數類型,能夠沒有參數可是這個括號不能夠省略; returns就是返回值列表,描述了函數返回值的變量名(可選)和類型, 若是函數返回一個沒有名字的參數或者沒有返回值,就能夠不要括號指針
這裏的參數和返回值的類型都不能省略,不過能夠簡寫(若是有的話)code
例如:io
func add(x int, y int) int { return x + y; } // 能夠簡寫成 func add(x, y int) int { return x + y; }
這裏須要注意的是函數調用都必須按照聲明順序爲全部的參數提供實參.而且Go語言的函數沒有默認值,也不能經過參數名指定形參,所以形參和返回值的變量名對於函數調用者是沒有用處的,只是在函數內部使用function
若是實參是引用類型,如指針,slice,map,function,channel等類型,在函數內部進行修改,就會影響到傳入的實參;test
其餘類型的實參是傳遞的是值的拷貝,對其修改不會影響函數外部。匿名函數
語法: func test(x int, ns ...int) { //... }
就是在參數類型前面加上三個點 「…」,這裏須要注意的地方是這個變參本質上是一個slice,可在函數內部直接訪問,而且一個函數只能有一個變長參數,而且只能在最後的位置變量
例如:map
func add(x int, nums ...int) int { for i := range nums { x += nums[i] } return x }
上面就是實現n個數的加法語法
同時在調用變參函數是,也能夠將slice做爲實參,不過須要展開,就是在slice後面加 「…」
調用方式:
add(10, 20, 30) // 60 // 也能夠使用slice s := []int{10, 20, 40} add(10, ...s) // 80
Go語言的函數支持多個返回值
func test() (int, int) { return 1, 2 }
此時就返回兩個值,就須要有兩個變量來接收,也能夠使用 _ 接收來忽略某個參數
同時咱們還能夠爲返回值起個名字
func test() (x int, y, int) { x = 10 y = 10 return }
此時就能夠使用return 隱式的返回參數了,會自動返回對應名字的參數,注意這裏的返回值的名字不會影響函數外部.
go也支持匿名函數,能夠直接賦值給變量,或者當作結構體的字段等
var add = func(x, y int) { return x + y; } // 而後就能夠使用變量名調用 add(10, 20) // 30