0 匿名函数概念
Go语言提供两种函数:有名函数和匿名函数。所谓匿名函数就是没有函数名的函数。匿名函数没有函数名,只有函数体。它和有名函数的最大区别是:我们可以在函数内部定义匿名函数,形成类似嵌套的效果。
匿名函数常用于实现回调函数、闭包等。
1 匿名函数
1.1 匿名函数的定义格式
func (参数列表) (返回值参数列表) {
函数体
}
<说明> 匿名函数除了没有函数名外,和普通函数完全相同。
1.2 匿名函数的特点
1、可以在定义匿名函数的同时直接调用执行。示例代码如下:
func main() {
func(s string) {
fmt.Println(s)
}("hello, world") //传入实参对匿名函数进行调用
}
《代码说明》上面示例中,定义了匿名函数体后,直接传入实参调用匿名函数。
2、可以将匿名函数赋值给函数变量。示例代码如下:
func main(){
add := func(x, y int) int { //将匿名函数赋值给函数变量add
return x + y
}
fmt.Printf("add type: %T\n", add) //打印变量add的类型
fmt.Printf("add(1, 2)= %d\n", add(1, 2))
}
运行结果:
add type: func(int, int) int
add(1, 2)= 3
《代码说明》上面示例中,将匿名函数体赋值给一个函数变量add,然后通过这个函数变量来调用匿名函数。
<提示> 将匿名函数赋值给变量,与为普通函数提供函数名标识符有着根本的区别。当然,编译器会为匿名函数生成一个“随机”的符号名。
3、可以将匿名函数作为函数实参。其实这种代码设计方式就是将匿名函数作为回调函数来使用。示例代码如下:
//遍历切片的元素,通过给定函数访问切片元素
func visit(list []int, f func(int)) {
for _, v := range list {
f(v)
}
}
func main() {
//使用匿名函数打印切片内容
visit([]int{1,2,3,4}, func(v int){
fmt.Println(v)
})
}
《代码说明》上面的代码中,使用匿名函数作为函数实参,传递给visit()函数的形参f,形参f是一个函数类型。在visit()函数中,就可以使用函数变量f 访问作为实参的匿名函数了。
<提示> 匿名函数作为回调函数来使用在Go语言的标准包中也是比较常见的。
4、匿名函数可以作为函数返回值使用。示例代码如下:
func test() func(int, int) int {
return func(x, y int) int {
return x + y
}
}
func main() {
add := test()
fmt.Printf("add type: %T\n", add) // add type: func(int, int) int
fmt.Printf("add value: %v\n", add) // add value: 0x49a800
fmt.Printf("add(1,2)= %d\n", add(1,2)) // add(1,2)= 3
}
《代码说明》test()函数的返回值返回的