zoukankan      html  css  js  c++  java
  • Go 高阶函数,闭包

    函数本身可作为参数和返回值(高阶函数)

    函数也可以作为参数,传给别的函数,函数也可以作为返回值,那函数是什么类型呢?

    确定函数类型的目的是写在参数和返回值里:  func  f1 ( f  func() )  func() int{  ...  }

    无参数无返回值:   func()
    无参数返回int:   func() int
    两个int参数一个int返回值:  func(int, int) int

    其他的类比。  不确定可以用fmt.Printf("%T", func)

    闭包

    闭包就是在函数里定义的匿名函数内可以使用该函数的参数。相当于把传给该函数的参数保存在了匿名函数

    匿名函数

    跟普通函数一样,去掉名字就行,在函数内部使用。
    func(a int, b int) int {
          return a + b
    }

    应用:用不带参数的方式调用一个带参数的函数

    一个函数,比如
    func add(a int,b int) int {
         return a + b
    }

    我想让它在另外一个函数内,以f()的方式调用,使用方式见下:
    f = wrapper(add, a, b)
    可以把 f 作为参数,传给别的函数,别的函数执行时,就直接f()就行

    package main

    import (
        "fmt"
    )

    func add(a int, b int) int {
        return a + b
    }

    func wrapper(f func(int, int) int, a int, b int) func() int {
        inner := func() int {
            return f(a, b)
        }
        return inner
    }

    func funcA(f func() int) int {
        fmt.Println("in funcA")
        ret := f()
        return ret
    }

    func main() {
        f := wrapper(add, 1, 2)
        fmt.Println(f())
        //也可以将f传给别的函数
        funcA(f)
    }
  • 相关阅读:
    应用服务器安装
    datasnap的线程池
    压缩OLEVARIANT数据
    服务端日志记录
    提交主从表的多个已经修改的数据
    MySQL与PostgreSQL相比哪个更好?
    Vue入门常用指令详解
    Laravel模型事件的实现原理详解
    Git 遇到了 early EOF indexpack failed 问题
    Laravel 代码开发最佳实践
  • 原文地址:https://www.cnblogs.com/staff/p/13222342.html
Copyright © 2011-2022 走看看