Go中的一流函数

我来自具有一流功能支持的JavaScript。例如,您可以:

  • 将一个函数作为参数传递给另一个函数

  • 从函数返回一个函数。

有人可以给我一个例子,说明我将如何在Go中执行此操作吗?


心有法竹
浏览 185回答 3
3回答

吃鸡游戏

package mainimport (&nbsp; &nbsp; "fmt")type Lx func(int) intfunc cmb(f, g Lx) Lx {&nbsp; &nbsp; return func(x int) int {&nbsp; &nbsp; &nbsp; &nbsp; return g(f(x))&nbsp; &nbsp; }}func inc(x int) int {&nbsp; &nbsp; return x + 1}func sum(x int) int {&nbsp; &nbsp; result := 0&nbsp; &nbsp; for i := 0; i < x; i++ {&nbsp; &nbsp; &nbsp; &nbsp; result += i&nbsp; &nbsp; }&nbsp; &nbsp; return result}func main() {&nbsp; &nbsp; n := 666&nbsp; &nbsp; fmt.Println(cmb(inc, sum)(n))&nbsp; &nbsp; fmt.Println(n * (n + 1) / 2)}输出:222111222111

慕莱坞森

规范中的相关部分:函数类型。这里的所有其他答案都首先声明一个新类型,这种类型很好(实践),并使您的代码更易于阅读,但知道这不是必需的。您可以使用函数值而无需为它们声明新的类型,如下面的示例所示。声明一个函数类型的变量,该变量具有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 {&nbsp; &nbsp; return func(x, y float64) float64 {&nbsp; &nbsp; &nbsp; &nbsp; return x + y&nbsp; &nbsp; }}让我们编写一个具有3个参数的函数,前2个是type float64,第3个是函数值,该函数需要2个type的输入参数float64并产生type的值float64。然后,我们正在编写的函数将调用传递给它的函数值作为参数,并使用前两个float64值作为函数值的参数,并返回传递的函数值返回的结果:func Execute(a, b float64, op func(float64, float64) float64) float64 {&nbsp; &nbsp; 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 {&nbsp; &nbsp; return func(x, y float64) float64 {&nbsp; &nbsp; &nbsp; &nbsp; return x + y&nbsp; &nbsp; }}或者:var adder func(x1, x2 float64) float64 = CreateAdder()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go