Go 匿名函数

匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式。

在Go语言中,函数可以像普通变量一样被传递或使用,这与C语言的回调函数比较类似。不同的是,Go语言支持随时在代码里定义匿名函数

代码格式

func (参数列表) (返回值列表) {
    函数体
}

举例1

    // 定义匿名函数并赋值给f变量,参数是变量data,int类型
    f := func(data int) {
       fmt.Println("hello", data)
    }
  // 此时f变量的类型是func(), 可以直接调用
    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

Go 匿名函数

经常使用的场景

案例1后置函数

最后面的小括号 一定要带,否则就会报错

defer func() {
    fmt.Println(1)
}()

案例

func NewPool(fn func() (io.Closer, error), size uint) (*Pool, error) {
    //做了size大小的判断,起码它不能小于或者等于0,否则就会返回错误。
    if size <= 0 {
        return nil, errors.New("size的值太小了。")
    }
    return &Pool{
        factory: fn,
        //如果参数正常,就会使用size创建一个有缓冲的通道,来保存资源,并且返回一个资源池的指针。
        //有了创建好的资源池,那么我们就可以从中获取资源了。
        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, 小括号代表执行和参数

本作品采用《CC 协议》,转载必须注明作者和本文链接
good good study day day up
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!