用复合函数解读-函数作为形参被调用


在golang中,函数也是一种数据类型,这条特性可以认为是对函数名进行重命名(改头换面),因此函数可以作为形参被调用

如何理解,我们可以从数学中的复合函数 y = f [g(x)] 解读这种特性,先看代码

package main
import "fmt"
// 1. 定义复合函数基本表达式
func GFunc(midFunc func(int, int) int, n1 int, n2 int ) (int) {
        return midFunc(n1, n2)
}
// 2. 新建内层函数
func uniSum(n1 int, n2 int) (int) {
        return n1 + n2
}
// 3. 调用复合函数
func main() {
        result := GFunc(uniSum,1,10)
        fmt.Println("result=",result)
}
# result= 11

复习一下复合函数

// 1. 定义复合函数基本表达式
func GFunc(midFunc func(int, int) int, n1 int, n2 int ) (int) {
return midFunc(n1, n2)
}

我们知道,复合函数表达式形如 y = f [g(x)] 包含外层函数和内层函数(多层作用关系自动简化为2层),这里第一步的函数就是整个复合函数的表达式,每个代码关键字都可以与数学表达式对应:

其中:

GFunc和midFunc可以分别看做外层函数名和内层函数名,由于数学中也没有计较必须是f和g,因此,这里和数学有异曲同工之妙,都可以自定义

func(int, int) int就是我们内层函数 g(x) 的数据类型!数据类型!数据类型!(重要事情说三遍)-->函数,(如同其他语言中输出数据类型,打印结果为函数),只不过可能有多个形参,也可能会是 func(float64, int32, byte, string) (float64, float64, string, int64)等形式,golang会将这些如实打印出来,因此我用多个占位符 _ 表示形参个数

n1就是内层函数的形参x,多个形参注意与内层函数数据类型保持一致

最后不要忘了返回值类型(int),因为要和return对应

因此,我们的内层函数 g(x) 有2个参数 n1, n2

外层函数 f(u) (u=g(x)) 有1个参数 g(n1, n2)

return为什么要这样写?

因为要真正的写实际的函数表达式了,而不再是“形如”了

也就是y=f[g(x)]要写成y=tan(3x+1)了,其实还是它本身

// 2. 新建内层函数
func uniSum(n1 int, n2 int) (int) {
return n1 + n2
}

只有外层函数(外表)还不行,还要有内层函数(灵魂),因此实际调用时,外层函数可以没有作用(相当于 f(x)=x ,我们的函数 f (n1, n2) = f ( g (n1, n2) ) = g (n1,n2) ,其实就是外层函数没有作用),但一定要有内层函数(人丑就要多读书),因此,内层函数通常对应我们的业务

// 3. 调用复合函数
func main() {
result := GFunc(uniSum,1,10)
fmt.Println("result=",result)
}

最后要调用内层函数了,你问我为什么不像数学那样写成 GFunc ( uniSum (1, 10) ) ???

我也想说呢,可以理解为为了突出函数名,突出函数作为参数的本质

猜你喜欢

转载自www.cnblogs.com/levin-ling/p/13369294.html