go语言闭包

一、基本介绍

闭包就是一个函数和于其相关的引用环境组合的一个整体

二、案例演示

累计器

package main

import (
	"fmt"
)

func AddUpper() func(int) int {
	n := 10
	return func(x int) int {
		n = n + x
		return n
	}
}

func main() {
	f := AddUpper()
	fmt.Printf("res=%d\n", f(1))
	fmt.Printf("res=%d\n", f(2))
	fmt.Printf("res=%d\n", f(3))
}

输出结果:

res=11
res=13
res=16

说明:

  1. AddUpper是函数,返回的数据类型是func(int) int
  2. AddUpper返回的是一个匿名函数,但是这个匿名函数引用函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
  3. 大家可以这样理解:闭包是类,函数时操作,n是字段。函数和它使用的n构成闭包
  4. 当我们反复的调用f时,因为n时初始化一次,因此每调用一次就进行累加,不会重新初始化
  5. 我们高清楚闭包的关键,就是要分析出返回的函数和它引用了哪些变量,因为返回的函数和它引用到的变量共同构成闭包

三、闭包的应用

需求:编写一个函数可以接收一个文件后缀名,当传入一个文件名时,如果该文件名没有指定后缀,则将接收的文件后缀名加在文件名后返回,如果指定了后缀名,则返回原文件名

import (
	"fmt"
	"strings"
)

func makeSuffix(suffix string) func(string) string {
	return func(fileName string) string {
		result := fileName
		if !strings.HasSuffix(fileName, suffix) {
			result = fileName + suffix
		}
		return result
	}
}

func main() {
	f := makeSuffix(".jpg")
	fmt.Println(f("aa.jpg"))
	fmt.Println(f("bb.jpg"))
}

输出结果:

aa.jpg
bb.jpg

代码说明:

  1. makeSuffix返回的是一个函数,返回的函数和makeSuffix(suffix string)的suffix变量组成了一个闭包,因为返回的函数引用到suffix这个变量。
    2.我们体会一下闭包的好处,如果使用传统方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,而闭包可以保留上次引用的某个值,所以我们传入一次就可以重复使用。
posted @ 2021-05-11 23:16  若雨蚂蚱  阅读(130)  评论(0编辑  收藏  举报