• FuncHigh高阶函数


    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)
    }
    
  • 相关阅读:
    运算符重载
    简单函数template max
    const static extern
    python 关闭垃圾回收
    Easy and cheap cluster building on AWS backup
    [转] Maven更新父子模块的版本号, mvn versions:set
    [转] ansible批量执行命令展示
    HBase 批量删除表 disable_all drop_all
    自动添加 ssh key 到远程主机的脚本,应用sshpass和ssh-copy-id
    MongoDB ver 4 几个常用命令
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129386.html
Copyright © 2020-2023  润新知