前言

变量不仅用于存储整数、字符串、布尔值等,它们还可以存储函数。然后可以使用这些变量来调用该函数并向其提供参数。

Here’s an example where we stored a function called add2NumbersTogether inside a variable called add:

在变量中存储函数 - 图2

第 14 行:我们将 add2NumbersTogether 函数保存到名为 add 的变量中。

第 15 行:从输出中,我们可以看到 add 的数据类型是 func(int, int) int。 (int, int) int 位称为函数签名

第 16 行:当变量包含函数时,您可以通过在变量后添加圆括号来调用该函数。这些圆括号还用于将所需的参数传递给函数。

Line 16: When a variable is holding a function, you can invoke that function by adding round brackets after the variable. These round brackets are also used for passing the required arguments to the function.

这是一个微不足道的例子,我们不喜欢函数名“add2NumbersTogether”,我们使用变量中的函数技术为它创建了一个名为“add”的别名。

This is a bit of a trivial example, where we didn’t like the function name “add2NumbersTogether”, and we used the functions-in-variables technique to create an alias for it called, “add”.

函数签名 Function Signatures

在许多编程语言中,变量属于特定的“数据类型”(例如字符串、整数等)。然而,在 Go 中,变量可以存储的不仅仅是传统的数据类型。这就是为什么我们避免使用“数据类型”术语,而是选择更广泛的术语“类型”。在将函数存储在变量中时,重要的是要记住以下几点:

When a variable stores a function, then its type is defined as a function with a specific function signature.

函数签名是指函数的输入+输出参数的组合。这个函数签名被视为它自己的类型。这意味着我们可以声明一个基于函数类型的变量,如下例所示。这与最后一个示例相同,但我们现在首先声明了变量(第 14 行):

在变量中存储函数 - 图3

更新函数类型变量

我们可以使用赋值运算符 = 将常规变量从一个值更新为另一个值,只要这些值的类型相同即可。对于函数类型变量也是如此。

在变量中存储函数 - 图4

这里变量公式最初存储函数加法(第 19 行),然后我们用不同的乘法替换函数(第 25 行)。

这仅在新函数具有匹配的函数签名时才有效,因为函数签名是类型规范的一部分(第 21 行)。

将匿名函数保存为变量

匿名函数通常保存到变量中。详见

匿名函数

在变量中存储函数 - 图5

将函数传递给其他函数

由于变量是用来给函数传递参数的,也就是说我们可以把一个完整的函数传递给另一个函数!!!下面是一个例子:

在变量中存储函数 - 图6

第 12 行:这行看起来很复杂,表示这个函数有 3 个输入参数,没有输出参数,第一个参数命名为“计算”,并接受类型为 func(int, int) int 的函数。 The “addition” function (line 7) has a matching function signature.

第 19 行:我们将一个函数以“add”变量的形式传入到公式函数中。

:::info Tip: We can actually delete line 18, and rewrite line 19 to formula(addition, 2, 6) and it’ll still work.

:::

我发现以这种方式编写的代码更难阅读(尤其是第 12 行)。这就是为什么我倾向于尽可能避免这种方法。然而,意识到这一点很重要,以防万一你遇到其他人的代码是这样写的。

从其他函数返回函数

与传入函数类似,您还可以设置函数以通过其输出参数返回函数。下面是一个例子:

在变量中存储函数 - 图7

Once again, I’m not a fan of writing code this way. I find it makes code harder to read.

参考资料