当前位置:   article > 正文

关于golang的函数式编程_golang函数式编程

golang函数式编程

函数式编程特点 参数 变量 返回值 都可以是函数

"正统"函数式编程特点如下

.不可变性:不能有状态,只有常量和函数

.函数只能有一个参数

go语言区别于“正统”函数式编程 go语言是面向大众的语言 所以不会在语法上纠结正统不正统

下面先看一个函数式编程 闭包 的例子

  1. package main
  2. import "fmt"
  3. func Adder() func(v int) int{ //闭包 返回值为匿名函数
  4. sum := 0 //自由变量 自由变量我的理解是此函数内有效的不被回收的值
  5. return func(v int)int{ //返回值为函数 完成闭包流程
  6. sum += v //sum为叠加 不会被释放
  7. return sum
  8. }
  9. }
  10. func main(){
  11. a := Adder() //将函数作为变量赋值给a是函数式编程的特点
  12. for i:= 0; i < 10; i++{
  13. fmt.Println(a(i)) //打印闭包返回值 i值实际是向Adder()的匿名函数赋值
  14. }
  15. }

比较一下正统的函数式编程

  1. type IAdder func(int) (int , IAdder)
  2. func adder2(base int) IAdder{
  3. return func(v int) (int, IAdder) {
  4. return base +v, adder2(base +v )
  5. }
  6. }
  7. func main(){
  8. a := adder2(0)
  9. for i:= 0; i < 10; i++{
  10. var s int
  11. s, a = a(i)
  12. fmt.Println(s)
  13. }
  14. }

区别是不是很大

下面再举一个例子

  1. package main
  2. import "fmt"
  3. func fibonacco()func () int{
  4. a, b:= 0,1
  5. return func()int{
  6. a,b = b, a+b
  7. return a
  8. }
  9. }
  10. func main(){
  11. a := fibonacco()
  12. for i:=0; i< 10; i++ {
  13. fmt.Println(a())
  14. }
  15. }

这是典型的斐波那契算法 用go语言实现显得很简洁

下面是用函数作为类型 定义接口 进行函数运算

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "bufio"
  6. "strings"
  7. )
  8. func fibonacco()intGen{
  9. a, b:= 0,1
  10. return func() int{
  11. a,b = b, a+b
  12. return a
  13. }
  14. }
  15. type intGen func() int //将函数定义为类型
  16. func (g intGen)Read(p []byte) (n int, err error){ //定义接口 go语言中任何类型都可以实现接口 函数只是一个特殊的参数
  17. next := g() //next是 类型传输值
  18. if next > 10000{ //限制无限循环
  19. return 0,io.EOF
  20. }
  21. s := fmt.Sprintf("%d\n",next) //将整形转化为字符串 strings.NewReader使用
  22. return strings.NewReader(s).Read(p) //使用s做打印 p为uint8可使用位数
  23. }
  24. func printFileContents(reader io.Reader){ //打印任何类型
  25. scanner := bufio.NewScanner(reader) //将函数转换 赋值给scanner
  26. for scanner.Scan() { //将scanner里面的值全部循环打印出来
  27. fmt.Println(scanner.Text())
  28. }
  29. }
  30. func main(){
  31. a := fibonacco()
  32. printFileContents(a)
  33. }

由上可得出 go语言中 函数式编程可用函数作为类型 将函数类型传递到函数里面直接可以使用

下面再来一个例子

  1. package tree
  2. import "fmt"
  3. type Node struct{ //二叉树
  4. Value int
  5. Left,Right *Node
  6. }
  7. func CreateNode(r int) *Node{
  8. return &Node{r,nil,nil}
  9. }
  10. func (node *Node)SetValue(v int){
  11. node.Value = v
  12. }
  13. func (node *Node)printf(){
  14. fmt.Println(node.Value)
  15. }
  16. func (node *Node)Traverse(){ //需要注意的地方在这
  17. node.TraverseFunc(func (n *Node){ //函数做参数传递 明确的表现出函数式编程
  18. n.printf() //n值由递归不断赋值 每次打印内容不相同
  19. })
  20. }
  21. func (node *Node)TraverseFunc(f func(*Node)){ //需要注意的地方在这 函数做参数传递 并且有形参f
  22. if node == nil{
  23. return
  24. }
  25. node.Left.TraverseFunc(f) //递归 同时传递f 我的理解是f值在递归返回之前 值不发生变化
  26. f(node) //f开始运作 f作为函数形参 并且函数为指针 node参数放入f中_
  27. //上方n形参指向地址改变 做出打印内容
  28. node.Right.TraverseFunc(f) //中序遍历 结束后打印剩余数据
  29. }
  1. package main
  2. import "awesomeProject1/test/shu/tree"
  3. func main(){
  4. root := tree.Node{3,nil,nil} //普通的二叉树赋值
  5. root.Left = &tree.Node{}
  6. root.Right = &tree.Node{Value:5}
  7. root.Right.Left = new(tree.Node)
  8. root.Left.Right = tree.CreateNode(2)
  9. root.Right.Left.SetValue(4)
  10. root.Traverse()
  11. }

总结go语言的函数式编程

.更为自然 不需要修饰如何访问自由变量

.没有lambda 但是具有匿名函数

.go语言闭包("函数式编程")个人认为是go语言的难点也是重点

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号