函数声明
函数声明包括函数名,形参列表,返回值列表(可选),函数体组成
func test(parameters) (returns) {
// ...
}
其中 parameters 就是函数的形参列表,描述了函数的参数名和参数类型,可以没有参数但是这个括号不可以省略; returns就是返回值列表,描述了函数返回值的变量名(可选)和类型, 如果函数返回一个没有名字的参数或者没有返回值,就可以不要括号
这里的参数和返回值的类型都不能省略,不过可以简写(如果有的话)
例如:
func add(x int, y int) int {
return x + y;
}
// 可以简写成
func add(x, y int) int {
return x + y;
}
这里需要注意的是函数调用都必须按照声明顺序为所有的参数提供实参.并且Go语言的函数没有默认值,也不能通过参数名指定形参,因此形参和返回值的变量名对于函数调用者是没有用处的,只是在函数内部使用
参数的传递方式
如果实参是引用类型,如指针,slice,map,function,channel等类型,在函数内部进行修改,就会影响到传入的实参;
其他类型的实参是传递的是值的拷贝,对其修改不会影响函数外部。
变长参数
语法:
func test(x int, ns ...int) {
//...
}
就是在参数类型前面加上三个点 “…”,这里需要注意的地方是这个变参本质上是一个slice,可在函数内部直接访问,并且一个函数只能有一个变长参数,并且只能在最后的位置
例如:
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
函数的特点总结
- 函数声明包括函数名,形参列表,返回值列表(可选),函数体组成
- 不支持参数默认值
- 如果实参是引用类型,如指针,slice,map,function,channel等类型,进行修改,就回影响实参;
- 其他类型的实参是传递的是值的拷贝,对其修改不会影响函数外部
- 支持变长参数
- 支持多返回值