Go:闭包
闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。
package main import "fmt" func add() func(int) int { i := 0 return func(j int) int { i += j return i } } func main() { f := add() fmt.Println(f(1)) // 1 fmt.Println(f(2)) // 3 fmt.Println(f(3)) // 6 } /* add 是一个函数,返回的数据类型是 func(int) int,它是一个匿名函数,这个 匿名函数引用了函数外的i,因此这个匿名函数就和i形成了一个整体,构成闭包。 */
另一个示例:
package main import ( "fmt" "strings" ) // 使用闭包形式检测一张图片后缀是否以 .png 结尾,如果不是则拼接上返回 func checkImageSuffix(suffix string) func(string) string { return func(name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } else { return name } } } func main() { f := checkImageSuffix(".png") fmt.Println(f("peiqi")) // peiqi.png fmt.Println(f("luffy.png")) // luffy.png }
显然如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,而闭包则可以保留上次引用的某个值,只需传入一次就可反复使用,这就是区别。