Go 中的一流函数
我来自 JavaScript,它具有一流的函数支持。例如,您可以:
- 将一个函数作为参数传递给另一个函数
- 从一个函数返回一个函数。
有人可以给我一个例子来说明如何在 Go 中做到这一点吗?
I come from JavaScript which has first class function support. For example you can:
- pass a function as a parameter to another function
- return a function from a function.
Can someone give me an example of how I would do this in Go?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
只是一个带有递归函数定义的脑筋急转弯,用于在 Web 应用程序中链接中间件。
首先,工具箱:
如您所见,
Chain
类型是一个函数,它返回相同类型Chain
的另一个函数(这真是一流!)。现在进行一些测试来看看它的实际效果:
同样,这只是一个脑筋急转弯,表明我们可以以不同的方式在 Go 中使用第一类函数。就我个人而言,我现在使用 chi 作为路由器和处理中间件。
Just a brainteaser with recursive function definition for chaining middlewares in a web app.
First, the toolbox:
As you see type
Chain
is a function that returns another function of the same typeChain
(How first class is that!).Now some tests to see it in action:
Again, this was just a brainteaser to show we can use first class functions in Go in different ways. Personally I use chi nowadays as router and for handling middlewares.
虽然您可以使用 var 或声明类型,但您不需要这样做。
你可以非常简单地做到这一点:
While you can use a var or declare a type, you don't need to.
You can do this quite simply:
规范中的相关部分:函数类型。
这里的所有其他答案首先声明一个新类型,这很好(实践)并且使您的代码更易于阅读,但要知道这不是必需的。
您可以使用函数值,而无需为其声明新类型,如下例所示。
声明一个函数类型的变量,该变量有 2 个
float64
类型的参数,并且有一个float64
类型的返回值,如下所示:让我们编写一个返回加法器函数的函数。此加法器函数应采用 2 个
float64
类型的参数,并在调用时返回这 2 个数字的总和:让我们编写一个具有 3 个参数的函数,前 2 个为
float64
类型>,第三个是函数值,该函数采用 2 个float64
类型的输入参数并生成float64
类型的值。我们编写的函数将调用作为参数传递给它的函数值,并使用前 2 个 float64 值作为函数值的参数,并返回传递的函数值的结果返回:让我们看看之前的示例:
请注意,当然您可以使用 短变量声明 创建
adder
时:在 Go Playground 上尝试这些示例。
使用现有函数
当然,如果您已经在包中声明了具有相同函数类型的函数,您也可以使用它。
例如
math.Mod()
具有相同的功能类型:因此您可以将此值传递给我们的
Execute()
函数:打印
2
因为12 mod 10 = 2
。请注意,现有函数的名称充当函数值。在 Go Playground 上尝试一下。
注意:
请注意,参数名称不是类型的一部分,具有相同参数和结果类型的两个函数的类型是相同的,无论参数名称如何。但要知道,在参数或结果列表中,名称必须全部存在或全部不存在。
例如,您还可以写:
或者:
The related section from the specification: Function types.
All other answers here first declare a new type, which is good (practice) and makes your code easier to read, but know that this is not a requirement.
You can work with function values without declaring a new type for them, as seen in the below example.
Declaring a variable of function type which has 2 parameters of type
float64
and has one return value of typefloat64
looks like this:Let's write a function which returns an adder function. This adder function should take 2 parameters of type
float64
and should returns the sum of those 2 numbers when called:Let's write a function which has 3 parameters, first 2 being of type
float64
, and the 3rd being a function value, a function that takes 2 input parameters of typefloat64
and produces a value offloat64
type. And the function we're writing will call the function value that is passed to it as parameter, and using the first 2float64
values as arguments for the function value, and returns the result that the passed function value returns:Let's see our previous examples in action:
Note that of course you can use the Short variable declaration when creating
adder
:Try these examples on the Go Playground.
Using an existing function
Of course if you already have a function declared in a package with the same function type, you can use that too.
For example the
math.Mod()
has the same function type:So you can pass this value to our
Execute()
function:Prints
2
because12 mod 10 = 2
. Note that the name of an existing function acts as a function value.Try it on the Go Playground.
Note:
Note that the parameter names are not part of the type, the type of 2 functions having the same parameter and result types is identical regardless of the names of the parameters. But know that within a list of parameters or results, the names must either all be present or all be absent.
So for example you can also write:
Or:
Go 语言和函数式编程可能会有所帮助。来自这篇博文:
作者是博客所有者:Dethe Elza(不是我)
Go Language and Functional Programming might help. From this blog post:
Author is the blog owner: Dethe Elza (not me)
输出:
output: