美文网首页
Go 什么是头等函数?

Go 什么是头等函数?

作者: sickle4j | 来源:发表于2021-01-04 17:52 被阅读0次

    原文请看: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)
    }
    

    在上面的示例中,我们先定义了一个函数simplesimple接收一个函数作为参数。在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)
    }
    

    相关文章

      网友评论

          本文标题:Go 什么是头等函数?

          本文链接:https://www.haomeiwen.com/subject/hzivoktx.html