一、介绍
Go语言支持匿名函数,即在需要使用函数时再定义函数,匿名函数没有函数名只有函数体,函数可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递,这与C语言的回调函数比较类似,不同的是,Go语言支持随时在代码里定义匿名函数。
匿名函数是指不需要定义函数名的一种函数实现方式,由一个不带函数名的函数声明和函数体组成,下面来具体介绍一下匿名函数的定义及使用。
1.1 定义 匿名函数
fun(参数)返回{
函数体
}
匿名函数的定义就是没有名字的普通函数定义。
1.2 定义 匿名函数的两种方式
匿名函数因为没有函数名,所以没办法像普通函数那样调用,所以匿名函数需要保存到某个变量或者作为立即执行函数:
- 保存到某个变量
- 立即执行函数
package main
import "fmt"
func main() {
// 定义匿名函数方式一
add := func (x, y int) {
fmt.Println(x + y)
}
add(1, 2) // 通过变量调用匿名函数
// 定义匿名函数方式二
func (x, y int) {
fmt.Println(x - y)
}(20, 5) //自执行函数:匿名函数定义完加()直接执行
}
1.3 匿名函数的两种场景(回调函数,闭包)
1.3.1 回调函数
func callFunc(base int, f func(int, int) int) {
num := f(base, 5) // 减少或者加上5
fmt.Printf("base %d 经过f处理后值是:%d \n", base, num)
}
func TestCallFunc(t *testing.T) {
addNum := func(base, num int) int {
return base + num
}
callFunc(100, addNum)
}
输出:
=== RUN TestCallFunc
base 100 经过f处理后值是:105
--- PASS: TestCallFunc (0.00s)
1.3.2 闭包
func TestClosure(t *testing.T) {
var j int = 1
f := func() {
var i int = 1
fmt.Printf("i, j: %d, %d\n", i, j)
}
f()
j += 2
f()
}
输出:
=== RUN TestClosure
i, j: 1, 1
i, j: 1, 3
--- PASS: TestClosure (0.00s)
在上面的示例中,匿名函数引用了外部变量,所以同时也是个闭包,变量 f 指向的闭包引用了局部变量 i 和 j,i 在闭包内部定义,其值被隔离,不能从外部修改,而变量 j 在闭包外部定义,所以可以从外部修改,闭包持有的只是其引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。