匿名函数
匿名函数是指不需要定义函数名的一种函数实现方式。
在Go语言中,函数可以像普通变量一样被传递或使用,这与C语言的回调函数比较类似。不同的是,Go语言支持随时在代码里定义匿名函数
代码格式
func (参数列表) (返回值列表) {
函数体
}
举例1
f := func(data int) {
fmt.Println("hello", data)
}
f(100)
举例2
for query := 2; query < 6; query++ {
func(q int,w int) {
fmt.Println("本次打印是 "+strconv.Itoa(q))
fmt.Println("本次打印是 "+strconv.Itoa(w))
}(3,4)
}
os.Exit(200)
本次打印是 3
本次打印是 4
本次打印是 3
本次打印是 4
本次打印是 3
本次打印是 4
本次打印是 3
本次打印是 4
可以看到 q int,w int 是声明的参数,}(3,4) ,3和4 是具体的参数,这就是匿名函数的传参方式
案例3
经常使用的场景
案例1后置函数
最后面的小括号 一定要带,否则就会报错
defer func() {
fmt.Println(1)
}()
案例
func NewPool(fn func() (io.Closer, error), size uint) (*Pool, error) {
if size <= 0 {
return nil, errors.New("size的值太小了。")
}
return &Pool{
factory: fn,
res: make(chan io.Closer, size),
}, nil
}
func createConnection() (io.Closer, error) {
id := atomic.AddInt32(&idCounter, 1)
return &dbConnection{id}, nil
}
p, err := pooltest.NewPool(createConnection, poolRes)
p.factory()
可以看到 调用 factory 函数 需要 p.factory() 而不能使用 p.factory, 小括号代表执行和参数