原文请看:https://studygolang.com/articles/12789
什么是头等函数?
支持头等函数(First Class Function)的编程语言,可以把函数赋值给变量,也可以把函数作为其他函数的参数或者返回值。Go语言支持头等函数的机制。
匿名函数
我们来编写一个简单的示例,把函数赋值给一个变量。
package main
import "fmt"
func main() {
a := func() {
fmt.Println("Hello World!!!")
}
a()
fmt.Printf("%T", a)
}
运行该程序,会输出:
Hello World!!!
func()
在上面的程序中,将一个函数赋值给了变量a。如果仔细观察,会发现赋值给a的函数没有名称。由于没有名称,这类函数称为匿名函数。
要调用一个匿名函数,可以不用赋值给变量。通过下面的例子,我们看看这是怎么做到的。
package main
import (
"fmt"
)
func main() {
func() {
fmt.Println("hello world first class function")
}()
}
当然也可以向匿名函数中传递参数
package main
import (
"fmt"
)
func main() {
func(n string) {
fmt.Println("Welcome", n)
}("Gophers")
}
结果
Welcome Gophers
高阶函数
- 接收一个或多个函数作为参数
- 返回值是一个函数
针对上述两种情况,我们看一些简单的例子:
把函数作为参数,传递给其它函数
package main
import "fmt"
func simple(t func(a, b int) int) {
fmt.Println(t(37, 23))
}
func main() {
f := func(a, b int) int {
return a + b
}
simple(f)
}
在上面的示例中,我们先定义了一个函数simple
,simple
接收一个函数作为参数。在main
中我们创建了一个匿名函数f
,其签名符合simple
函数的参数,调用后打印出60。
在其他函数中返回函数
package main
import (
"fmt"
)
func simple() func(a, b int) int {
f := func(a, b int) int {
return a + b
}
return f
}
func main() {
s := simple()
fmt.Println(s(37,23))
}
上面的示例结果仍然是60。
闭包
闭包是匿名函数的一个特例。当一个匿名函数所访问的变量定义在函数体的外部时,就可以称这样的匿名函数为闭包。
看看一个示例就明白了。
package main
import (
"fmt"
)
func main() {
a := 5
func() {
fmt.Println("a =", a)
}()
}
头等函数的实际用途
提供一个示例给大家看下:
package main
import (
"fmt"
)
type student struct {
firstName string
lastName string
grade string
country string
}
func filter(s []student, f func(student) bool) []student {
var r []student
for _, v := range s {
if f(v) == true {
r = append(r, v)
}
}
return r
}
func main() {
s1 := student{
firstName: "Naveen",
lastName: "Ramanathan",
grade: "A",
country: "India",
}
s2 := student{
firstName: "Samuel",
lastName: "Johnson",
grade: "B",
country: "USA",
}
s := []student{s1, s2}
f := filter(s, func(s student) bool {
if s.grade == "B" {
return true
}
return false
})
fmt.Println(f)
}
网友评论