Go基础之函数式编程(闭包)

函数式编程并非Go语言所特有,Go语言对函数式编程主要是体现在闭包上面。

函数式编程 vs 函数指针:
函数是一等公民:参数,变量,返回值都可以是函数(c++里只有函数指针,Java里函数只是一个名字);高阶函数:函数的参数可以是一个函数;函数–>闭包。

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

函数闭包:
在这里插入图片描述
“正统”函数式编程
1)不可变性:不能有状态,只有常量和函数; 2)函数只能有一个参数 但是学习的这篇视频不作这个严格规定。

//实现正统函数式编程不能有状态 应该放在一个新的函数里面
type iAdder func(int) (int, iAdder)
 
func adder2(base int) iAdder {
    return func(v int) (int, iAdder) {
        return base + v, adder2(base + v)
    }
}

函数接口

type intGen func() int
 
func (g intGen) Read(
    p []byte) (n int, err error) {
    next := g() //取下一个元素
    if next > 1000 {//达到1000以上结束
        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 Fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {
    var f intGen = Fibonacci()
    printFileContents(f)
}

其他语言的闭包

# Python中的闭包:python原生支持闭包、使用_closure_来查看闭包内容
def adder():
      sum = 0
      def  f(value):
            nonlocal sum
            sum += value
            return sum 
      return f
// C++中的闭包:过去stl或者boost带有类似库;C++11及以后:支持闭包   以下是C++14下编译通过的
auto adder(){
  auto sum = 0;
   return [-] (int value) mutable {
    sum += value;
    return sum;
  }
} 
// Java中的闭包:1.8以后:使用Function接口和Lambda表达式来创建函数对象  函数本身不能作为参数和返回值的
Function<Integer,Integer> adder() {
  final Holder<Integer> sum = new Holder<>(0);
   return (Integer value) -> {
    sum.value += value;
    return sum.value;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值