Go语言 一级函数 --- 匿名函数、高阶函数、闭包

导言

  • 原文链接: Part 33: First Class Functions
  • If translation is not allowed, please leave me in the comment area and I will delete it as soon as possible.

一级函数

一级函数是什么?

当一个语言,具有以下特性:

  1. 支持把函数赋值给变量
  2. 将函数以参数形式传递给其他函数
  3. 能作为其他函数的返回值

那我们就说这个语言支持一级函数。

Go语言 拥有上述的特性,所以它支持一级函数。

接下来,我们将讨论一级函数的句式,与其多样的用法。

匿名函数

我们来看一个简单的例子。在这个例子中,我们把一个函数赋给了一个变量。

package main

import (  
    "fmt"
)

func main() {
     
    a := func() {
   
        fmt.Println("hello world first class function")
    }
    a()
    fmt.Printf("%T", a)
}

在上面程序的第 8 行,我们把函数赋值给了变量。如果你仔细观察,你会发现:分配给 a 的函数,它是没名字的。这一类函数被叫做匿名函数,因为它们没用名字。

现在,我们只能通过 变量a 去调用这个函数。在下一行中,我们就是这样做的。我们使用 a() 进行函数调用,此时会打印一句话: hello world first class function。在第 12 行,我们输出了 变量a 的类型,结果为 func()

运行上面的程序,将会有以下输出:

hello world first class function  
func()

其实,我们还有一种调用匿名函数的方法,这种方法无需将匿名函数赋值给变量。下面的例子就是这样做的。

package main

import (  
    "fmt"
)

func main() {
     
    func() {
   
        fmt.Println("hello world first class function")
    }()
}

在上面程序的第 8 行,有一个匿名函数被定义,且被立即调用。此时程序输出如下:

hello world first class function  

我们也可以向匿名函数传递参数。

package main

import (  
    "fmt"
)

func main() {
     
    func(n string) {
   
        fmt.Println("Welcome", n)
    }("Gophers")
}

在上面程序的第 10 行,我们向匿名函数传递了一个 string类型 的参数。运行程序,输出如下:

Welcome Gophers 

自定义函数类型

与结构体类似,我们也可以自定义函数类型。

type add func(a int, b int) int 

上面的程序片段,创建了一个新的函数类型 add,这个函数类型接收 2 个整型参数,返回值类型也是整型。现在,我们就能定义 add类型 的变量了。

来写个程序吧,在这个程序中,我们定义了一个 add类型 的变量。

package main

import (  
    "fmt"
)

type add func(a int, b int) int

func main() {
     
    var a add = func
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值