zoukankan      html  css  js  c++  java
  • 匿名函数和闭包

    Go语言基础之匿名函数和闭包

    一、匿名函数

    函数还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只能定义匿名函数。匿名函数就是没有函数名的函数,匿名函数的定义格式如下:

    func(参数)(返回值){
        函数体
    }
    

    匿名函数因为没有函数名,所以没办法像普通函数那样调用,所以匿名函数需要保存到某个变量或者作为立即执行函数:

    func main() {
        // 将匿名函数保存到变量
        add := func(x, y int) {
            fmt.Println(x + y)
        }
        add(10, 20) // 通过变量调用匿名函数
    
        //自执行函数:匿名函数定义完加()直接执行
        func(x, y int) {
            fmt.Println(x + y)
        }(10, 20)
    }
    

    匿名函数多用于实现回调函数和闭包。

    二、闭包

    闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。 首先我们来看一个

    闭:指的是定义在函数内部的函数,注意,在Go语言中,定义在函数内部的函数必须是匿名函数

    包:闭函数包含了对外层函数名字的引用

    例子:

    func adder() func(int) int {
        var x int
        return func(y int) int {
            x += y
            return x
        }
    }
    func main() {
        var f = adder()  // f = func(y int) int{...}
        fmt.Println(f(10)) //10
        fmt.Println(f(20)) //30
        fmt.Println(f(30)) //60
    
        f1 := adder()
        fmt.Println(f1(40)) //40
        fmt.Println(f1(50)) //90
    }
    

    变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。 在f的生命周期内,变量x也一直有效。 闭包进阶示例1:

    func adder2(x int) func(int) int {
        return func(y int) int {
            x += y
            return x
        }
    }
    func main() {
        var f = adder2(10)
        fmt.Println(f(10)) //20
        fmt.Println(f(20)) //40
        fmt.Println(f(30)) //70
    
        f1 := adder2(20)
        fmt.Println(f1(40)) //60
        fmt.Println(f1(50)) //110
    }
    

    闭包进阶示例2:

    func makeSuffixFunc(suffix string) func(string) string {
        return func(name string) string {
            if !strings.HasSuffix(name, suffix) {
                return name + suffix
            }
            return name
        }
    }
    
    func main() {
        jpgFunc := makeSuffixFunc(".jpg")
        txtFunc := makeSuffixFunc(".txt")
        fmt.Println(jpgFunc("test")) //test.jpg
        fmt.Println(txtFunc("test")) //test.txt
    }
    

    闭包进阶示例3:

    func calc(base int) (func(int) int, func(int) int) {
        add := func(i int) int {
            base += i
            return base
        }
    
        sub := func(i int) int {
            base -= i
            return base
        }
        return add, sub
    }
    
    func main() {
        f1, f2 := calc(10)
        fmt.Println(f1(1), f2(2)) //11 9
        fmt.Println(f1(3), f2(4)) //12 8
        fmt.Println(f1(5), f2(6)) //13 7
    }
    

    闭包其实并不复杂,只要牢记闭包=函数+引用环境

    三、总结

    1. 匿名函数,匿名函数因为没有函数名,所以没办法像普通函数那样调用,匿名函数需要保存到某个变量或者作为立即执行函数

      func(参数)(返回值){
          函数体
      }
      
    2. 闭包:闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境

  • 相关阅读:
    Linux磁盘分区、挂载
    crond任务调度
    Form组件使用
    Django路由系统
    Django中模板简单使用
    ORM常用操作
    IO多路复用
    vscode必装插件
    Flask-RESTful扩展
    flask-caching
  • 原文地址:https://www.cnblogs.com/randysun/p/15415539.html
Copyright © 2011-2022 走看看