go

go闭包

2017-07-08  本文已影响44人  浑浑噩噩_邋邋遢遢
package main

import "fmt"

func addn(n int) func(int) int {
    return func(m int) int {
        return  m + n
    }
}

func main() {
    //f := addn(10)(5)
    f := addn(10)
    fmt.Println(f(5))
}
这里的函数接受了一个int参数,返回了一个匿名函数。在调用addn时,返回了就是一个函数,需要再次传参调用执行。其结果为15

这里需要注意,在写闭包函数时,返回的匿名函数要跟外层的函数签名保持一致。而且里面的参数发现了没,里层函数的参数是可以调用外层的函数的参数的,有一种继承的意思。

利用闭包和匿名函数,创造生成器的函数
package main

import "fmt"

func iter(s []int) func() int {
    var i = 0
    return func() int {
        if i >= len(s) {
            return 0
        }
        n := s[i]
        i += 1
        return n
    }
}

func main() {
    f := iter([]int{1, 2, 3})
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
}
package main

import (
    "fmt"
    "errors"
)

func iter(s []int) func() (int, error) {
    var i = 0
    return func() (int, error) {
        if i >= len(s) {
            return 0, errors.New("end")
        }
        n := s[i]
        i += 1
        return n, nil
    }
}

func main() {
    f := iter([]int{1, 2, 3})
    for  {
        n, err :=f()
        if err != nil{
            break
        }
        fmt.Println(n)
    }
}

上一篇 下一篇

猜你喜欢

热点阅读