go语言开发基础14 - 之go语言里的函数之函数与匿名函数
函数是组织好的、可重复使用的、用于执行指定任务的代码块。
Go语言中支持函数、匿名函数和闭包
一、go语言里函数的特点
1.不支持重裁(即一个包里不能有两个名字一样的函数)
2.函数也是一种类型,一个函数可以赋值给变量
3.函数支持多返回值
4.支持匿名函数
二、函数传值说明
1.无论是值传递还是引用传递,传递给函数的都是变量的副本
2.值传递是值拷贝,引用是地址拷贝,地址拷贝更高效,值拷贝取决于拷贝对象大小(对象越大,拷贝性能越低)
3.map、slice、chan、指针、interface默认以引用的方式传递,其他的都是值传递
三、go语言里的函数语法
func 函数名(参数)(返回值){
函数体
}
函数的参数和返回值是可选的。
3.1、函数名的定义说明:
1.函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。
2.参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
3.返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。
4.函数体:实现指定功能的代码块。
四、第一个函数示例
一、有参数和返回指的函数定义
func add(x int, y int) (num int) {
return x + y
}
//函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:
二、没有参数和返回值的函数
func testDemo() {
fmt.Println("Hello World !")
}
4.1、函数调用
定义了函数之后,我们可以通过函数名()的方式调用函数。 例如我们调用上面定义的两个函数,代码如下:
func main() {
fmt.Println(add(10, 20)) // 结果为:30
testDemo() // 结果为:Hello World !
}
五、可变参数
可变参数是指函数的参数数量不固定。Go语言中的可变参数通过在参数名后加...来标识。
注意:可变参数通常要作为函数的最后一个参数。
举个例子:
func intSum2(x ...int) int {
fmt.Println(x) //x是一个切片
sum := 0
for _, v := range x {
sum = sum + v
}
return sum
}
//执行结果为:
ret1 := intSum2() // 结果:[]
ret2 := intSum2(10) // 结果:[10]
fmt.Println(ret1, ret2) // 结果:0 10
5.1、固定参数和可变参数结合使用
固定参数搭配可变参数使用时,可变参数要放在固定参数的后面,示例代码如下:
func intSum3(x int, y ...int) int {
// fmt.Println(x, y)
sum := x
for _, v := range y {
sum = sum + v
}
return sum
}
调用上述函数:
ret5 := intSum3(100)
ret6 := intSum3(100, 10)
ret7 := intSum3(100, 10, 20)
ret8 := intSum3(100, 10, 20, 30)
fmt.Println(ret5, ret6, ret7, ret8) //100 110 130 160
本质上,函数的可变参数是通过切片来实现的。
六、返回值
Go语言中函数支持多返回值,函数如果有多个返回值时必须用()将所有返回值包裹起来,举个例子:
func calc(x, y int) (int, int) {
sum := x + y
sub := x - y
return sum, sub
}
6.1、返回值命名
函数定义时可以给返回值命名,并在函数体中直接使用这些变量,最后通过return关键字返回。例如:
func calc(x, y int) (sum, sub int) {
sum = x + y
sub = x - y
return // 命名返回值后 return后面就不用加内容了
}
七、匿名函数
函数当然还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只能定义匿名函数。匿名函数就是没有函数名的函数,匿名函数的定义格式如下:
7.1、一名函数定义语法
func(参数)(返回值){
函数体
}() // 函数体后面加()可以直接调用匿名函数了
7.2、匿名函数示例
// 1.在函数里定义匿名函数
func test1(a, b int) int {
result := func(a1 int, b1 int) int {
return a1 + b1
}
return result(a, b) // 匿名函数的两种调用方法:第一种:再函数的大括号后面直接加小括号实现调用。第二种:通过变量加小括号实现调用
}
// 2.在外部直接定义匿名函数
var (
result := func(a1 int, b1 int) int {
return a1 + b1
}(10, 20) // 加()直接实现调用该匿名函数
)
匿名函数多用于实现回调函数和闭包。

浙公网安备 33010602011771号