Go语言之函数使用(8)闭包
一、基本介绍
闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)
二、快速入门案例
package main
import "fmt"
func AddUpper(str string) func (int) int {
var n int = 10
//var str string = "tom~"
return func(x int) int {
n = n + x
str += " hello "
fmt.Println("str=", str)
return n
}
}
func main() {
f := AddUpper("jack") // f就是一个函数 func (int) int
fmt.Println(f(1)) // 11 jack hello
fmt.Println(f(2)) // 13 jack hello hello
fmt.Println(f(3)) // 16 jack hello hello hello
}
案例分析:
1)AddUpper会返回一个匿名函数
func(x int) int {
n = n + x
return n
}
2)该匿名函数引用到其函数外部一个变n
var n int = 10
return func(x int) int {
n = n + x
return n
}
3)你匿名函数和它引用到的外部变量n,形成一个整体,构成一个闭包。
4)f(1) , f(2) …即在反复调用闭包。
5)当我们使用闭包时,该匿名函数引用到外部n, 只会被初始化一次,以后调用时,则使用同一n.。
6)你可以这样理解,把闭包看成一个类,匿名函数就相当于方法,而引用到的外部变量就是字段。
7)搞清楚闭包的关键点,就是分析出,该匿名函数引用到外部变量是哪些。
三、闭包最佳实践
1、请编写一个程序,具体要求如下
1) 编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
2) 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
3) 要求使用闭包的方式完成
4) strings.HasSuffix
2、代码说明
1) 返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量 组合成一个闭包,因为 返回的函数引用到suffix这个变量
2) 我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入 后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!
package utils
import (
"strings"
)
/*
1)编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭
2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
3)要求使用闭包的方式完成
4)strings.HasSuffix //提示会使用到函数
*/
// 使用闭包
func MakeSuffix1(suffix string) func(string) string {
return func (str string) string {
if strings.HasSuffix(str,suffix) {
return str
}else {
return str + suffix
}
}
}
// 传统方式
func MakeSuffix2(suffix string, str string) string {
if strings.HasSuffix(str, suffix) {
return str
} else {
return str + suffix
}
}
上一篇: Java求三角形的面积
下一篇: JS记忆函数