funcadder()func(int)int{
sum :=0returnfunc(v int)int{
sum += v
return sum
}}funcmain(){
adder :=adder()for i :=0; i <10; i++{
fmt.Println(adder(i))}}
函数式编程 vs 函数指针
函数是一等公民:参数,变量,返回值都可以是函数
高阶函数
函数 -> 闭包
“正统” 函数式编程
不可变性 : 不能有状态, 只有常量和函数
函数只能有一个参数
go语言闭包的应用
例一 : 斐波那契数列
funcFibonacci()func()int{
a, b :=0,1returnfunc()int{
a, b = b, a+b
return a
}}
例二 : 为函数实现接口
type intGen func()intfunc(g intGen)Read(
p []byte)(n int, err error){
next :=g()if next >10000{return0, io.EOF
}
s := fmt.Sprintf("%d\n", next)// TODO: incorrect if p is too small!return strings.NewReader(s).Read(p)}funcprintFileContents(reader io.Reader){
scanner := bufio.NewScanner(reader)for scanner.Scan(){
fmt.Println(scanner.Text())}}funcmain(){var f intGen = fib.Fibonacci()printFileContents(f)}