基本介绍
- 闭包就是一个函数与其相关的引用环境组成的一个整体(所谓的引用环境其实可以理解成变量).
示例
- 代码
package main
import "fmt"
func main() {
f := add()
fmt.Println(f(1))
fmt.Println(f(2))
}
func add() func(int) int {
var n int = 10
return func(i int) int {
n += 1
return n
}
}
- 结果
- 说明
- add 是一个函数,返回的数据类型是
func(int) int
- 返回的是一个匿名函数,但是这个匿名函数引用到函数外部的变量
n
,因此这个匿名函数就和这个n
组成一个闭包.
- add 是一个函数,返回的数据类型是
网上有一个闭包的最佳实践,抄来用一下.
package main
import (
"fmt"
"strings"
)
func main() {
f := makeSuffix(".jpg")
fmt.Println("makeSuffix = 有后缀 ", f("test01.jpg"))
fmt.Println("makeSuffix = 没有后缀 ", f("test01"))
fmt.Println("===================")
fmt.Println("makeSuffix2 = 有后缀", makeSuffix2(".jpg", "test01.jpg"))
fmt.Println("makeSuffix2 = 没有有后缀", makeSuffix2(".jpg", "test01"))
}
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
func makeSuffix2(suffix string, name string) (string) {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
运行结果
这个例子中使用闭包的优点是 : 只需要传入一次后缀名就可以了.