为了账号安全,请及时绑定邮箱和手机立即绑定

Go中的一流函数

Go中的一流函数

Go
心有法竹 2021-04-06 17:15:57
我来自具有一流功能支持的JavaScript。例如,您可以:将一个函数作为参数传递给另一个函数从函数返回一个函数。有人可以给我一个例子,说明我将如何在Go中执行此操作吗?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

package main


import (

    "fmt"

)


type Lx func(int) int


func cmb(f, g Lx) Lx {

    return func(x int) int {

        return g(f(x))

    }

}


func inc(x int) int {

    return x + 1

}


func sum(x int) int {

    result := 0


    for i := 0; i < x; i++ {

        result += i

    }


    return result

}


func main() {

    n := 666


    fmt.Println(cmb(inc, sum)(n))

    fmt.Println(n * (n + 1) / 2)

}

输出:


222111

222111


查看完整回答
反对 回复 2021-04-26
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

规范中的相关部分:函数类型。


这里的所有其他答案都首先声明一个新类型,这种类型很好(实践),并使您的代码更易于阅读,但知道这不是必需的。


您可以使用函数值而无需为它们声明新的类型,如下面的示例所示。


声明一个函数类型的变量,该变量具有2个类型的参数,float64并且具有一个类型的返回值,float64如下所示:


// Create a var of the mentioned function type:

var f func(float64, float64) float64

让我们编写一个返回加法器函数的函数。此加法器函数应采用2个类型的参数,float64并在调用时应返回这2个数字的和:


func CreateAdder() func(float64, float64) float64 {

    return func(x, y float64) float64 {

        return x + y

    }

}

让我们编写一个具有3个参数的函数,前2个是type float64,第3个是函数值,该函数需要2个type的输入参数float64并产生type的值float64。然后,我们正在编写的函数将调用传递给它的函数值作为参数,并使用前两个float64值作为函数值的参数,并返回传递的函数值返回的结果:


func Execute(a, b float64, op func(float64, float64) float64) float64 {

    return op(a, b)

}

让我们来看一下前面的示例:


var adder func(float64, float64) float64 = CreateAdder()

result := Execute(1.5, 2.5, adder)

fmt.Println(result) // Prints 4

请注意,当然也可以使用短变量声明创建时adder:


adder := CreateAdder() // adder is of type: func(float64, float64) float64

在Go Playground上尝试这些示例。


使用现有功能

当然,如果您已经在具有相同函数类型的包中声明了一个函数,则也可以使用该函数。


例如,math.Mod()具有相同的功能类型:


func Mod(x, y float64) float64

因此,您可以将此值传递给我们的Execute()函数:


fmt.Println(Execute(12, 10, math.Mod)) // Prints 2

打印,2因为12 mod 10 = 2。请注意,现有功能的名称充当功能值。


在Go Playground上尝试一下。


笔记:


请注意,参数名称不是该类型的一部分,具有相同参数和结果类型的2个函数的类型相同,而与参数名称无关。但是要知道,在参数或结果列表中,名称必须全部存在或不存在。


因此,例如,您还可以编写:


func CreateAdder() func(P float64, Q float64) float64 {

    return func(x, y float64) float64 {

        return x + y

    }

}

或者:


var adder func(x1, x2 float64) float64 = CreateAdder()


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信