• Golang函数-匿名函数应用案例回调函数和闭包函数


            Golang函数-匿名函数应用案例回调函数和闭包函数

                                   作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

     

     

     

    一.匿名函数概述

      什么是匿名函数:
        顾名思义,就是没有函数名,只有函数体,函数可以被作为一种类型被赋值给函数类型的变量,匿名函数往往以变量方式被传递。Go是支持匿名函数的,即在需要使用函数时再定义函数
    
      Go域名函数定义就是没有名字的普通函数,定义格式如下:
        func (参数列表) (返回值列表){
          函数体
        }

    二.定义匿名函数

    1>.定义匿名函数时直接调用

    package main
    
    import (
        "fmt"
    )
    
    func main() {
    
        /*
            定义匿名函数时直接调用
        */
        res := func(x int, y int) (z int) {
            z = x + y
            return z
        }(100, 20)
    
        fmt.Printf("res的类型为[%T],res的值为[%d]
    ", res, res)
    }

    2>.先声明匿名函数,再调用匿名函数

    package main
    
    import (
        "fmt"
    )
    
    func main() {
    
        /*
            定义匿名函数,此时add是一个函数类型,只不过它是一个匿名函数。
        */
        add := func(x int, y int) (z int) {
            z = x + y
            return z
        }
        fmt.Printf("add的类型为[%T]
    ", add)
    
        /*
            我们可以通过函数类型add来多次调用匿名函数
        */
        res1 := add(100, 200)
        res2 := add(300, 500)
        fmt.Printf("res1的类型为[%T],res1的值为[%d]
    ", res1, res1)
        fmt.Printf("res2的类型为[%T],res2的值为[%d]
    ", res2, res2)
    }

    3>.匿名函数可以作为返回值被多次调用

    package main
    
    import (
        "fmt"
    )
    
    //使用type来定义一个匿名函数类型
    type FUNCTYPE func(int, int) int
    
    func demo() FUNCTYPE {
        /*
            demo的返回值为我们上面定义的匿名函数类型
        */
        return func(x int, y int) int {
            res := x + y
            return res
        }
    }
    
    func main() {
        /*
    
            add的类型为(匿名)函数类型
        */
        add := demo()
        fmt.Printf("add的类型为[%T],add匿名函数的内存地址是[%X]
    ", add, add)
    
        /*
            我们可以通过函数类型add来多次调用匿名函数
        */
        res1 := add(100, 200)
        res2 := add(300, 500)
        fmt.Printf("res1的类型为[%T],res1的值为[%d]
    ", res1, res1)
        fmt.Printf("res2的类型为[%T],res2的值为[%d]
    ", res2, res2)
    }

    三.匿名函数的应用场景(匿名函数经常被用于实现回调函数,闭包等)

    1>.回调函数案例

    package main
    
    import (
        "fmt"
    )
    
    /*
        函数回调:
            简称回调,英文名为:"Callback",即"call then back",被主函数调用运算后会返回主函数。
            是指通过函数参数传递到其它代码的,某一块可执行代码的引用
    
        匿名函数作为回调函数的设计在Go语言的系统包中是很常见的,比如strings包中又有着中实现,代码如下所示:
            func TrimFunc(s string, f func(rune) bool) string{
                return TrimRightFunc(TrimLeftFunc(s,f),f)
            }
    */
    func callback(f func(int, int) int) int {
        return f(10, 20)
    }
    
    func add(x int, y int) int {
        return x + y
    }
    
    func main() {
        /*
            匿名函数(函数名本身是代码区的一个地址)的用途非常广泛,匿名函数本身是一种值,可以方便的保存在各种容器中实现回调函数和操作封装
        */
        fmt.Println(add)
    
        /*
            函数回调操作
        */
        fmt.Println(callback(add))
    }

    2>.闭包函数案例

    package main
    
    import (
        "fmt"
    )
    
    /*
        什么是闭包函数:
            闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。
            闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。
    
        Go语言支持匿名函数作为闭包。匿名函数是一个"内联"语句或表达式。
    
        下面实例中,创建了函数"getSequence()",返回另外一个匿名函数"func() int"。该函数的目的在闭包中递增number变量。
    */
    func getSequence() func() int {
        number := 100
        return func() int {
            /*
                匿名函数的优越性在于可以直接使用函数内的变量,不必声明。
            */
            number += 1
            return number
        }
    }
    
    func main() {
        /*
            f1为一个空参匿名函数类型,number变量的值依旧为100
        */
        f1 := getSequence()
    
        /*
            调用f1函数,number变量自增1并返回
        */
        fmt.Println(f1())
        fmt.Println(f1())
        fmt.Println(f1())
    
        fmt.Println("=====我是分割线=====")
        /*
            创建新的匿名函数 f2,并查看结果
        */
        f2 := getSequence()
        fmt.Println(f2())
        fmt.Println(f2())
    }

  • 相关阅读:
    python:封装连接数据库方法
    Python:self理解
    python:pytest优秀博客
    python:pytest中的setup和teardown
    python:单元测试框架pytest的一个简单例子
    java中的static关键字解析
    浅谈Java中的final关键字
    SpringMVC+Spring+Mybatis框架集成
    Mybatis学习总结(四)——输入映射和输出映射
    Mybatis学习总结(三)——SqlMapConfig.xml全局配置文件解析
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12297708.html
Copyright © 2020-2023  润新知