FuncHigh高阶函数
首先高阶函数也是函数,相对于普通函数还是有点区别的,区别点在于:这个函数的形参列表或返回参数列表中存在数据类型为函数类型,这就是高阶函数。
你会发现,我上面讲过的闭包(我的搜索栏目搜索FuncClosure
即可),和这个高阶函数有很多相似之处,没错,闭包就是高阶函数,他只是其中的一种,因为闭包是函数返回,还有一种就是形参是函数的。
我们来实现一个闭包加上形参的高阶函数
package high_func
import "fmt"
func HighFunc(val int, f func(i1 int) int) (func() int) {
biVar := 0
fmt.Println("此时闭包的值为", biVar)
return func() int {
if f(biVar) <= 3 {
fmt.Println("可以加一")
biVar++
}
return val + biVar
}
}
测试文件
package high_func
import (
"fmt"
"testing"
)
func TestHighFunc(t *testing.T) {
highFunc := HighFunc(0, func(i1 int) int {
return i1
})
for i := 0; i <= 9; i++ {
fmt.Println(highFunc())
}
}
结果输出
此时闭包的值为 0
可以加一
1
可以加一
2
可以加一
3
可以加一
4
4
4
4
4
4
4
作用
那么,作为形参的闭包有啥用的?我们一般用它作为其他形参的限制条件,这一点你也可以不用这样写。这样写的好处就是可以在你写代码的地方简介明了的看出来他是干啥的,并且代码写着方便。
这种代码,我认为,对于学习js的人来说,是还可以的,毕竟js的箭头函数和这玩意很相似,对于js来说,有封装好的迭代函数,some, every, reduce, filter, 还有一个,忘了,尴尬。。。
以后,我会根据js的迭代函数,来实现几个切片的过滤,会增加到util里面
下面来看一下别人写实际用处的过滤输出例子
package main
import "fmt"
type student struct{
name string
grade int8
}
func filter(stu []student, f func(s student) bool) []student{
var r []student
for _, s := range stu {
if f(s) == true {
r = append(r, s)
}
}
return r
}
func main() {
s1 := student{
"zhangsan",
90,
}
s2 := student{
"lisi",
80,
}
s3 := student{
"wanggang",
70,
}
s := []student{s1, s2, s3}
fmt.Println("all student: ", s)
var result []student
result = filter(s, func(s student) bool {
if s.grade < 90 {
return true
}
return false
})
fmt.Println("less than 90: ", result)
}