美文网首页
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://studygolang.com/articles/12789[https://study...

  • 33. 函数是一等公民(头等函数)

    33. 函数是一等公民(头等函数) 现在简单概括一下本教程讨论的内容: 什么是头等函数? 匿名函数 用户自定义的函...

  • JavaScript函数入门,先了解这些基本术语

    让我们谈谈什么是:lambdas(匿名函数)、 first-class functions(头等函数)、highe...

  • 【Scala】头等函数与函数即对象

    头等函数 Scala的函数是头等函数(first-class function)。你不仅可以定义和调用函数,还可以...

  • Go语言学习笔记-函数的高级使用方法

    Golang支持头等函数的机制。头等函数:支持头等函数的编程语言,可以把函数赋值给变量,也可以把函数作为其他函数的...

  • 21. Go 协程

    21. Go 协程 Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是...

  • 函数

    本节学习几种函数 匿名函数 高阶函数 闭包 头等函数的作用 匿名函数 什么是匿名函数? 通俗的讲就是没有函数名的函...

  • 局部变量和全局变量

    什么是局部变量? 在Go语言和C语言中写在{}中或者函数中或者函数的形参, 就是局部变量 什么是全局变量? 在Go...

  • Go语言中的匿名函数

    1 什么是匿名函数 在Go语言中,不需要函数名的函数,称为匿名函数。例如正常的函数sayHello()是这样的: ...

  • 第四章 函数

    一、函数 1.1 什么是函数 函数是执行特定任务的代码块。关键字func用于定义函数。go中函数特点: 无须前置声...

网友评论

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

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