2、函数式编程

闭包实现一个累加器

package main

import "fmt"

//    闭包(实现0加到i,结果是多少)

func adder() func(int) int {
    sum := 0
    return func(v int) int {
        sum += v
        return sum
    }
}

func main() {
    a := adder()
    for i := 0; i < 10; i ++{
        fmt.Printf("0 加到 %d 是 %d\n",i,a(i))
    }
}

//0 加到 0 是 0
//0 加到 1 是 1
//0 加到 2 是 3
//0 加到 3 是 6
//0 加到 4 是 10
//0 加到 5 是 15
//0 加到 6 是 21
//0 加到 7 是 28
//0 加到 8 是 36
//0 加到 9 是 45

 

正统函数式编程,实现上述例子

type iAdder func(int) (int, iAdder)

func adder(base int) iAdder {
    return func(v int) (int,iAdder) {
        return base + v, adder(base + v)
    }
}

func main() {
    a := adder(0)
    for i := 0; i < 10; i ++{
        var s int
        s,a = a(i)
        fmt.Printf("0 加到 %d 是 %d\n",i,s)
    }
}

 

利用闭包实现,斐波那契数列

// fibonacci(i = 前面两个数之和)

func fibonacci() func() int {
    a,b := 0,1
    return func() int {
        a,b = b, a + b
        return a
    }
}

func main() {
    f := fibonacci()
    fmt.Println(f()) // 1
    fmt.Println(f()) // 1
    fmt.Println(f()) // 2
    fmt.Println(f()) // 3
    fmt.Println(f()) // 5
    fmt.Println(f()) // 8
}

 

函数实现接口

// fibonacci(i = 前面两个数之和)

type intGen func() int

func (g intGen) Read (p []byte) (n int, err error)  {
    next := g()
    if next > 10000 { // 当数量大于10000就退出
        return 0,io.EOF
    }
    s := fmt.Sprintf("%d\n",next)

    // TODO: incorrect if p is too small
    return strings.NewReader(s).Read(p)
}

func printFileContent(reader io.Reader)  {
    scanner := bufio.NewScanner(reader)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

func fibonacci() intGen {
    a,b := 0,1
    return func() int {
        a,b = b, a + b
        return a
    }
}

func main() {
    f := fibonacci()
    printFileContent(f)
}

 

上一篇:2.PasswordEncoder


下一篇:作用域相关知识