要一直走下去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

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

确定函数类型的目的是写在参数和返回值里:  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)
}

 

posted on 2020-07-01 23:37  要一直走下去  阅读(379)  评论(0编辑  收藏  举报