Golang函数
函数包含函数的名称、参数列表和返回值类型,这些构成了函数的签名(signature)。
Go语言函数声明基本格式
func functionName (参数列表) (返回值) {
函数体
...
return 语句
}
注意:
1、左大括号“{”必须和“func”放在同一行,右大括号“}”必须单独占一行。
2、函数会在执行完最后一条语句,或执行return语句后结束,Go语言函数支持多返回值。
Go语言中函数的特性
1、go语言中有 3 种函数:普通函数、匿名函数(没有名称的函数)、方法(定义在struct上的函数)。
2、go语言中不允许函数重载(overload),也就是说不允许函数同名。
3、go语言中的函数不能嵌套函数,但可以嵌套匿名函数。
4、函数是一个值,可以将函数赋值给变量,使得这个变量也成为函数。
5、函数可以作为参数传递给另一个函数。
6、函数的返回值可以是一个函数。
7、函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再将副本传递给函数。
8、函数参数可以没有名称。
参数传递
在Go语言中,函数参数可以是值类型或引用类型,值类型作为函数参数进行传递时,是一个参数值的拷贝,引用类型作为函数参数传递时,是一个地址拷贝。
1、常规传递
当使用普通变量作为函数参数时,在传递参数时只是对变量值的拷贝,即将实参的值复制给变参。当函数对变参进行处理时,并不影响原实参的值。
2、指针传递
函数的参数不仅可以使用普通变量,还可以使用指针变量。当使用指针变量作为函数的参数时,在进行参数传递时将是一个地址拷贝即将实参的内存地址复制给变参,这时对变参的修改同时也会影响到实参的值。
3、数组元素作为函数参数
同常规传递一样,是一个“值拷贝”。
4、数组名作为函数参数
和其他语言不同,Go语言在将数组名作为函数参数时,参数传递即是对数组的复制。在形参中对数组元素的修改,都不会影响实参数组组元素原来的值。
5、切片Slice作为函数参数
当希望通过形参对底层数组进行修改时,可以使用Slice作为函数参数。在使用Slice作为函数参数时,进行参数传递将是一个地址拷,即将底层数组的内存地址复制给参数Slice。这时,对Slice元素的操作即是对底层数组元素的操作。
6、函数作为参数
返回值
返回值的忽略
在处理多返回值时,对于不想要的值,可以使用 “_” 进行忽略
命名返回值参数
如果使用命名返回值参数,则return语句可以为空;否则,return语句必须按照顺序返回多个结果
func f(a, b int)(sum, sub int){
sum = a + b
sub = a * b
return //若不命名sum、sub,则需改写为 return a+b,a*b
}
变参函数
1、变参函数的声明
func 函数名 (变参名 ... 数据类型) 返回值 {
函数体
...
}
注意:
1、变参类型的定义格式是 “...类型”,而且变参必须是函数的最后一个参数。如果函数还有其他参数,则必须放在变参的前面定义,例如:func f(a int, s string, args...int){} 。
2、不定长变参其实质就是一个切片,可以使用 range 进行遍历。
2、变参的传递
其接收到的是某一类型的Slice,可全部传递,也可部分传递。
package main
import "fmt"
func main() {
f1(1, 2, 3, 4, 5)
}
//声明函数f1()、f2()为变参函数
func f1(args ...int) {
//全部传递,即将函数 f1() 的 args 直接复制给函数 f2()
f2(args...)
//部分传递,将 args 中的第3个以后的元素复制给函数 f2()
f2(args[2:]...)
}
func f2(args ...int) {
fmt.Println(args)
}
输出结果:
[1 2 3 4 5]
[3 4 5]
3、任意类型的变参
Go语言中,向变参函数传递不同类型的参数,变参类型应指定为 空接口 interface{}
func f(args...interface{}){
...
}