一.函数与闭包
- 函数是一等公民:参数,变量,返回值都可以是函数
- 高阶函数
- 函数->闭包
func adder() func(int) int {
sum := 0
fmt.Println(sum)
return func(v int) int {
sum += v
fmt.Printf("v:%d,sum:%d \n", v, sum)
return sum
}
}
func main() {
a := adder()
fmt.Println(a(4))
for i := 0; i <= 10; i++ {
fmt.Println(a(i))
}
}
二.函数式编程例子-斐波那契数列
type intGen func() int
func fiboncci() intGen {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
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 := fiboncci()
printFileContents(f)
}
三.函数式编程-树的遍历
// 遍历
func (node *Node) Traverse() {
node.TraverseFunc(func(node *Node) {
node.Print()
})
fmt.Println()
}
func (node *Node) TraverseFunc(f func(*Node)) {
if node == nil {
return
}
node.Left.TraverseFunc(f)
f(node)
node.Right.TraverseFunc(f)
}
func main() {
root.Traverse()
nodeCount := 0
root.TraverseFunc(func(node *tree.Node) {
nodeCount++
})
fmt.Println(nodeCount)
}

被折叠的 条评论
为什么被折叠?



