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
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()
- 3 回答
- 0 关注
- 184 浏览
添加回答
举报