go语言开发基础17 - 之go语言里的闭包函数

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

package main

import "fmt"

func adder() func(int) int {         // 2.定义一个adder函数,返回值是一个函数
    var x int        // 3.函数里定义一个int类型的变量, 第一次调用x值为:0。9.第二次调用x值为10
    return func(y int) int {    // 4.返回一个函数,第一次调用时y值为10.第二次调用y值为20
        x += y    // 7.第一次调用x+y=10.第二次调用x+y=30
        return x   // 第一次返回结果为:10。第二次返回结果为:30
    }
}
func main() {        // 1.程序执行入口
    var f = adder()     // 5.将adder函数的返回函数赋值给变量f
    fmt.Println(f(10))   // 6.第一次调用,结果为:10
    fmt.Println(f(20))   //8.第二次调用,在上次调用得到的结果的基础上操作,结果为:30
    fmt.Println(f(30))   // 第三次调用,在第二次调用得到结果的基础上操作,结果为:60
}

  

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

func adder2(x int) func(int) int {   // 变量赋值给f时x的值为10,第二次调用时x的值为20.
    return func(y int) int {    // 第一次调用y的值为10。第二次调用y的值为:20
        x += y    // 第一次调用:x+y=20。第二次调用x+y=40
        return x
    }
}
func main() {
    var f = adder2(10)
    fmt.Println(f(10))    //20
    fmt.Println(f(20))    //40
    fmt.Println(f(30))    //70
}

  

闭包进阶示例2:

func makeSuffixFunc(suffix string) func(string) string {
    return func(name string) string {
        if !strings.HasSuffix(name, suffix) {    // 判断name不是以suffix结尾
            return name + suffix    // 就执行这里
        }
        return name
    }
}

func main() {
    jpgFunc := makeSuffixFunc(".jpg")    // .jpg结尾
    txtFunc := makeSuffixFunc(".txt")   // .txt结尾
    fmt.Println(jpgFunc("test"))    //结果为:test.jpg
    fmt.Println(txtFunc("test"))     //结果为:test.txt
}

  

闭包进阶示例3:

func calc(base int) (func(int) int, func(int) int) {        // 2.定义calc函数,返回值是两个匿名函数
    add := func(i int) int {     // 匿名函数
        base += i       // 加法运算
        return base
    }

    sub := func(i int) int {        // 匿名函数
        base -= i        // 减法运算
        return base
    }
    return add, sub
}

func main() {         // 1.程序执行入口
    f1, f2 := calc(10)    // 3.将calc函数的返回值赋值给两个变量(f1对应add函数、f2对应sub函数)
    fmt.Println(f1(1), f2(2))    //结果为:11 9   (第一次:10+1=11、11-2=9)
    fmt.Println(f1(3), f2(4))    //结果为:12 8    (第二次:9+3=12、12-4=8)
    fmt.Println(f1(5), f2(6)) //结果为:13 7       (第三次:8+5=13、13-6=7)
}

  

 

posted @ 2020-06-02 17:44  欧-阳  阅读(105)  评论(0)    收藏  举报