zoukankan      html  css  js  c++  java
  • 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)
    }
    
  • 相关阅读:
    51串口通信
    juicer使用备忘
    51单片机音乐盒程序
    最精简24L01程序--接收
    sqlserver 数据库迁移
    sqlserver自增主键
    js keycode
    tabindex 去掉虚线
    div 绑定keyup
    sqlserver 当前时间减去30天
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129386.html
Copyright © 2011-2022 走看看