正文
//函数式编程
//函数与闭包
/概念一
函数是 一等公民,
也就是说
参数,变量,返回值都可以是函数.
概念二
高阶函数参数是函数.
概念三
正统函数式编程.
不可变性,不能有状态,只有常量和函数,
函数只能有一个参数。/
package chapter2
import"fmt"
type iAdder func(int )(int,iAdder)
func adder2(base int)iAdder{
return func(v int)(int,iAdder){
return base+v,adder2(base+v)
}}
func adder () func(int) int{
//sum save like a global variables.
// funcbody 局部变量 自由变量
sum:=0
return func(v int) int{
sum+=v
return sum
}
}
func test(){
a:=adder()
b:=adder2(0)
for i:=0;i<10;i++{
s,b=b(i)
fmt.Printf("0+1+1+ ..%d=%d\n"),i,a(i))
}
}
例子一
package chapter2
// 引入
import (
"bufio"
"fmt"
"io"
"strings"
)
//定义 fib函数
func fibonacci() intGen{
a,b:=0,1
return func() int{
a,b=b,a+b
return a
}
}
// 创建新类型
type intGen func() int
func (g intGen)Read(p []byte)(n int,err error){
next :=g()
if next>10000{
return 0,io.EOF
}
s:=fmt.Sprintf("%d\n",next)
return strings.NewReader(s).Read(p)
}
func printFileContents(reader io.Reader){
scanner:=bufio.NewScanner(reader)
for scanner.Scan(){
fmt.Println(scanner.Text())
}
}
func main(){
f:=fibonacci()
f()
f()
printFileContents(f)
}
例子三
package chapter2
import "fmt"
type Node struct{
Left,Right *Node
Val int
}
func (node *Node)Traverse(){
node.TraverseFunc(func (node *Node){
node.Print()
})
fmt.Println(1)
}
func (node *Node)TraverseFunc(f func(*Node)){
if node ==nil{
return
}
node.Left.TraverseFunc(f)
f(node)
node.Right.TraverseFunc(f)
}
//更为自然,不需要修饰如何访问自由变量
//没有lambda 表达式,但是有匿名函数。