Go基础知识学习3 闭包
闭包本质是函数+引用环境,外形是一个匿名函数。 闭包类似一个函数工厂,绑定不同的引用环境,生成不同的函数。 我们还是以回调函数中的例子来说明,不过我们换成闭包来实现“抽象” 将一个数组中偶数的值相加后的结果输出, 将一个数组中奇数的值相加后的结果输出。
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/