zoukankan      html  css  js  c++  java
  • Go中的闭包

    第一次接触到闭包的这个名词,是在JavaScript中,下面来看看go语言中的闭包吧

    基本介绍
      闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。
    下面看一段代码:

    对上面代码的说明和总结:

      1AddUpper 是一个函数,返回的数据类型是 fun (int) int

      2、闭包的说明

    返回的是一个匿名函数, 但是这个匿名函数引用到函数外的 n ,因此这个匿名函数就和 n 形成一个整体,构成闭包。

      3、大家可以这样理解: 闭包是类, 函数是操作,n 是字段。函数和它使用到 n 构成闭包。

      4、当我们反复的调用 f 函数时,因为 n 是初始化一次,因此每调用一次就进行累计。

      5、我们要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引

    用到的变量共同构成闭包。

      6、对上面代码的一个修改,加深对闭包的理解

    闭包的最佳实践

    下面我们来编写一个程序,有如下要求:

      1、编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包

      2、调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg 后缀,则返回原文件名。

      3、要求使用闭包的方式完成

      4strings.HasSuffix , 该函数可以判断某个字符串是否有指定的后缀。

    代码如下:

    func makeSuffix(suffix string) func (string) string {
    
        return func (name string) string {
            //如果 name 没有指定后缀,则加上,否则就返回原来的名字
            if !strings.HasSuffix(name, suffix)  {
                return name + suffix
            }
    
            return name
        }
    }
    func main() {
        
        //使用前面的代码
        // f := AddUpper()
        // fmt.Println(f(1))// 11 
        // fmt.Println(f(2))// 13
        // fmt.Println(f(3))// 16
        //测试makeSuffix 的使用
        //返回一个闭包
        f2 := makeSuffix(".jpg") //如果使用闭包完成,好处是只需要传入一次后缀。
        fmt.Println("文件名处理后=", f2("winter")) // winter.jgp
        fmt.Println("文件名处理后=", f2("bird.jpg")) // bird.jpg
    
        fmt.Println("文件名处理后=", makeSuffix2("jpg", "winter")) // winter.jgp
        fmt.Println("文件名处理后=", makeSuffix2("jpg", "bird.jpg")) // bird.jpg
    }

    运行结果如下:

    上面的代码总结和说明:

    1、返回的匿名函数和 makeSuffix (suffix string) suffix 变量 组合成一个闭包,因为 返回的函数引用到 suffix 这个变量

    2、我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入 后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把

  • 相关阅读:
    hihoCoder #1078 : 线段树的区间修改
    hihoCode r#1077 : RMQ问题再临-线段树
    hihoCoder #1070 : RMQ问题再临
    hihoCoder #1068 : RMQ-ST算法(模板)
    LeetCode Valid Sudoku 有效数独
    150 Evaluate Reverse Polish Notation 逆波兰表达式求值
    149 Max Points on a Line 直线上最多的点数
    148 Sort List 链表上的归并排序和快速排序
    147 Insertion Sort List 链表插入排序
    146 LRU Cache 最近最少使用页面置换算法
  • 原文地址:https://www.cnblogs.com/taotaozhuanyong/p/14583904.html
Copyright © 2011-2022 走看看