##闭包本质是函数+引用环境,外形是一个匿名函数。 闭包类似一个函数工厂,绑定不同的引用环境,生成不同的函数。 我们还是以回调函数中的例子来说明,不过我们换成闭包来实现“抽象” 将一个数组中偶数的值相加后的结果输出,将一个数组中奇数的值相加后的结果输出。
package main import ( "fmt" ) func main() { //create slice s := make([]int,10) fmt.Println(s) // init for i,_ := range s { s[i] = i } fmt.Println(s) //closure doubleSum := sum(isDouble) singleSum := sum(isSingle) fmt.Println(doubleSum(s)) fmt.Println(singleSum(s)) } /** callback function : elemet who is even number **/ func isDouble(a int) bool { if a%2 == 0 { return true } else { return false } } /** callback function : elemet who is single number **/ func isSingle(a int) bool { if a%2 == 0 { return false } else { return true } } /* closure */ func sum(f func(int) bool) func([]int) int { return func(a []int) int { sum := 0 for _,v := range a { if f(v) { sum += v } } return sum } }
这里使用sum这个函数 返回两个匿名函数,分别完成对偶数和奇数的相加结果输出,这里面的外部环境是 f func(int) bool,这个函数的不同,生产出来的匿名函数的功能也就不一样。
##闭包官方有个案例可以参考:
- http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
- http://golang.org/doc/articles/wiki/
##代码: https://github.com/panyingyun/gostudy/blob/master/exp3.go
原文链接:https://www.f2er.com/go/190835.html