Go函数
函数是基本的代码块,它的作用是可以将实现某个功能的多行代码封装到一段代码块中(即函数),在需要的时候去调用。同个函数可以被多次调用,实现代码重用。
函数一般会有参数和返回值(也可以没有),函数名称、函数参数、函数返回值以及它们的类型被统称为函数签名
在Go语言中,函数有以下一些特点:
- 支持不定长变参、多返回值、命名返回值参数
- 支持匿名函数、闭包
- 函数可以作为一种类型使用
- Go函数不支持嵌套、重载
Go函数定义
Go函数定义格式如下:
func function_name ([parameter list]) [return_type]{
函数体
}
- 由关键字
func
开始声明定义函数 parameter list
:参数列表,一般格式为param1 type1, param2 type2...
return_type
:返回值类型,这里可以只写返回值类型,也可以为返回值命名(即支持命名返回值参数的写法:ret1 type1
)
函数值传递与引用传递
Go函数被调用的时候,传入的参数会被复制然后传递到函数内部使用,即函数体中使用的是参数副本。这种方式也称之为值传递
- 值传递:即传递参数副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量
- 引用传递:如果希望在函数内对原始的参数进行直接修改,需要将参数的地址(变量名前加
&
符号)作为输入参数传递给函数(即引用传递)。此时传递的是地址的副本,但地址副本指向位置还是原来变量的位置,因此可以通过该指针来修改原来的变量。如果传递的是slice
、map
这类引用类型,它们默认都是采用引用传递
Go函数的各种使用形式
- 函数返回多个值,在声明中在输入参数后面指定返回值的类型(用括号括起来),函数结束时
return
多个返回值
func main(){
r1, r2 := A(1, "A")
}
func A(a int, b string) (int, string) {
c := a + 1
d := b + "aa"
return c, d
}
- 多个参数如果类型相同,可以合并写法,单个返回值可以不写括号
func main(){
r3 := B(1, 2, 3)
}
func B(a, b, c int) int {
return a + b + c
}
- 命名返回值写法,使用这种形式,返回值的名称已经在声明中定义,不需要在函数体内定义,
return
后面也可以不写上返回值的名称,默认会返回函数声明中那几个命名的返回值
func main(){
r4, r5, r6 := C()
}
func C