慕莱坞森
规范中的相关部分:函数类型。这里的所有其他答案都首先声明一个新类型,这种类型很好(实践),并使您的代码更易于阅读,但知道这不是必需的。您可以使用函数值而无需为它们声明新的类型,如下面的示例所示。声明一个函数类型的变量,该变量具有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()