计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个可以把参数值带入程序的入口和一个获得返回值的出口。
函数参数与返回值
函数能够接收参数,也可以返回零个或多个值。相比于 C、C++、Java 和 C#,多值返回是 Go 的一大特性。
按值传递和按引用传递
Go 默认使用按值传递来传递参数,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。
func f(x){
// 函数体
}
如果希望函数可以直接修改参数的值,则需要将参数的地址(变量名前面添加 & 符号)传递给函数,这就是按引用传递,此时传递给函数的是一个指针。
func f(&y){
// 函数体
}
命名返回值
命名返回值作为结果形参被初始化为相应类型的零值,当需要返回的时候,我们只需要一条简单的不带参数的 return 语句。即使只有一个命名返回值,也需要使用 () 括起来.
使用非命名返回值的情况,当需要返回多个非命名返回值时,需要使用 () 把它们括起来。
func f(input int)(int,int){//命名返回值
return 2 * input, 3 * input
}
func f1(input int)(x1 int,x2 int){//非命名返回值
x2 = 2 * input
x3 = 3 * input
// return x2, x3
return
}
//以上两个函数结果相同
函数类型
函数变量的类型通过参数类型和返回值的类型确定。如果两个函数的参数列表和返回值列表都是相同的,那么两个函数的类型就是相同的,但两个函数不同。
带有函数名的函数
//定义一个函数
func 函数名(参数列表) (返回值列表){
// 函数体
}
也可以用下面方式定义函数
var m func (x int, y int) (z int, p int)
var m func (_ int, _ int) (_ int, _ int)
//与func(int,int)(int,int)是同一类型
参数列表必须用一对小括号括起来,即使此列表为空。
匿名函数
func(参数列表) (返回值列表) {
// 函数体
}
GO内置函数
| 名称 | 说明 |
|---|---|
| close | 用于管道通信 |
| len | 返回某个类型的长度或数量(字符串,数组,切片,map通道) |
| cap | 用于返回某个类型的最大容量(只能用于切片和map) |
| new | 用于分配内存,用于值类型和用户定义的类型 |
| make | 用于分配内存,用于内置引用类型(切片、map 和管道) |
| copy、append | 用于复制和连接切片 |
| panic、recover | 用于错误处理机制 |
| print、println | 底层打印函数,在部署环境中建议使用 fmt 包 |
| complex、real、imag | 用于创建和操作复数 |