文章目录
导言
- 原文链接: 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.
一级函数
一级函数是什么?
当一个语言,具有以下特性:
- 支持把函数赋值给变量
- 将函数以参数形式传递给其他函数
- 能作为其他函数的返回值
那我们就说这个语言支持一级函数。
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