【一Go到底】第二十天---闭包

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

一、闭包

1.1 闭包介绍

闭包就是一个函数和与其相关的引用环境组合的一个整体(实体) 闭包:类 函数:操作 n: 字段

1.2 案例演示

package main

import "fmt"

// 累加器
// 返回的数据类型是 fun(int) int,是一个匿名函数
// 该匿名函数引用到了函数外的 n ,因此该匿名函数和n组成一个整体,构成闭包
// 函数和它使用到的n构成闭包
func AddUpper() func(int) int {
	// 仅初始化一次
	var n int = 10
	return func(i int) int {
		n += i
		return n

	}
}

func main() {
	f := AddUpper()
	// 反复调用f函数时,n仅初始化一次,因此每调用一次就进行一次累加
	fmt.Println(f(1))
	fmt.Println(f(2))
	fmt.Println(f(3))

}


2.闭包最佳实践

  1. 编写一个函数makeffix(suffix string)可以接收一个文件后缀名(比如.jpg),并返回一个闭包
  2. 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名。
  3. 要求使用闭包的方式完成
  4. strings.HasSuffix 判断是否有指定后缀
package main

import (
	"fmt"
	"strings"
)

func makeSuffix(suffix string) func(string) string {
	return func(name string) string {
		// 如果name 没有指定的后缀,就机上,否则,返回原来的名字
		if strings.HasSuffix(name, suffix) == false {
			return name + suffix
		}

		return name
	}
}
func main() {
	// 测试makeSuffix

	// 先返回闭包
        // 如果使用闭包仅传一次就可以
	s := makeSuffix(".jpg")
	fmt.Println("文件名处理后 = ", s("winter"))
	fmt.Println("文件名处理后 = ", s("winter--2.jpg"))

}

案例说明

  1. 返回的函数和makeSuffx (suffix string)的suffx变量和返回的函数组合成一个闭包,因为返回的函数引用到suffix这个变量
  2. 闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。

`