函数声明包括函数名,形参列表,返回值列表(可选),函数体组成函数
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