首页 > 其他 > 详细

Go函数式编程的闭包和装饰器设计模式

时间:2021-07-20 23:04:37      阅读:22      评论:0      收藏:0      [点我收藏+]

函数式编程的准则:

不依赖外部的数据,也不改变外部数据的值,而是返回一个新的值。
func inc(v int ) int {
     return v+1 
} 

在面向对象编程中,我们传递的是对象,在函数式编程中,传递的是函数,函数可以作为另一个函数的参数或返回值、可以赋值给一个变量。

闭包经常用在函数式编程中,闭包只是在形式和表现上像函数,但实际上它并不是函数。函数是由可执行代码组成,在执行时不会发生变化,而闭包在不同的引用环境会有不同的表现。

函数式编程中至少要满足其中一个条件:

接受一个或多个函数作为输入参数
输出一个函数

Go支持匿名函数,即可以将函数作为普通变量使用:在函数中传递、赋值给变量。

 

package main
import  "fmt"
func adder() func(int) int {
   sum := 0
   innerfunc := func(x int) int {
      sum += x
      return sum
   }
   return innerfunc
}

func main(){
   add := adder()
   for i := 0; i < 5; i++ {
      fmt.Println(add(i))
   }
 
 

 

 

技术分享图片
./hello 
0
1
3
6
10
技术分享图片

Go可以在函数内部定义匿名函数,adder中定义了一个匿名函数,然后赋值给innerfunc变量,最后将其作为返回值。

for循环中每次通过不同参数调用adder函数时(不同引用环境),匿名函数引用了外层的局部变量sum,由于外部变量的作用域而没有被释放。

技术分享图片
package main
import  "fmt"
func adder() func(int) int {
   sum := 0
   innerfunc := func(x int) int {
      sum += x
      return sum
   }
   return innerfunc
}

func main(){
   add := adder()
   for i := 0; i < 5; i++ {
      fmt.Println(add(i))
   }
   add2 := adder()
   for i := 0; i < 5; i++ {
      fmt.Println(add2(i))
   }
}
 
技术分享图片

 

 
./hello 
0
1
3
6
10
0
1
3
6
10

 

package main
import "fmt"
type funcHander func(string)

func decorator(f func(string)) func(string){
   return func(s string) {
      f(s)
   }
}

func run(name string){
   fmt.Println(name + " run")
}
func talk(name string){
   fmt.Println(name + " talk")
}
//管道操作,遍历多个子修饰器,运行对应的代码
func Decorate(name string, ds ...funcHander){
   for _,a := range ds{
      decorator(a)(name)
   }
}

func main(){
   decorator(run)("zhangsan") //通过装饰器调用
   Decorate("lisi",run, talk) //通过装饰器管道调用
}

 

./hello
zhangsan run
lisi run
lisi talk

 

 

 

 

Go函数式编程的闭包和装饰器设计模式

原文:https://www.cnblogs.com/dream397/p/15036535.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!