zoukankan      html  css  js  c++  java
  • golang学习笔记---闭包

    package main
    
    import (
        "fmt"
    )
    
    // 累加器
    //    AddUpper:方法名    func (int) int:返回值类型列表
    func AddUpper() func(int) int {
        var n int = 10
        return func(x int) int {
            n = n + x
            return n
        }
    }
    
    // 闭包案例演示
    func main() {
        // 使用累加器
        f := AddUpper()
    
        fmt.Println(f(1)) // 11
        fmt.Println(f(2)) // 13
        fmt.Println(f(3)) // 16
    }

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

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

    2) 闭包的说明

    返回的是一个匿名函数, 但是这个匿名函数引用到函数外的 n(当做一个全局变量来理解即可) ,因此这个匿名函数就和 n 形成一个整体,构成闭包。

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

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

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

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

    package main
    import (
        "fmt"
        "strings"
    )
    
    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() {
        // 返回一个闭包
        f2 := makeSuffix(".jpg")
        fmt.Println("文件处理后 = ", f2("winter"))         // winter.jpg
        fmt.Println("文件处理后 = ", f2("soldier.jpg"))    // soldier.jpg
    }

    上面代码的总结和说明:

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

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

  • 相关阅读:
    pyqt-QGrapicsView类
    pyqt5.0 GraphicsView框架
    STM32(三)- GPIO输入输出之按键检测点亮LED
    STM32(二)- 位带操作、启动文件讲解
    STM32(一)- 基于固件库的工程模板
    C语言(四)- C预处理和C库
    C语言(三)- 结构体、结构体指针、位运算
    C语言(二)- 函数、指针、数组
    C语言(一)- 基础知识
    [caffe笔记]:杀死caffe多个进程中的某个(发生 leveldb lock 解决方法)
  • 原文地址:https://www.cnblogs.com/saryli/p/13551836.html
Copyright © 2011-2022 走看看