Go语言中的函数式编程实践
本文主要讲解Go语言中的函数式编程概念和使用,分享给大家,具体如下:
主要知识点:
- Go语言对函数式编程的支持主要体现在闭包上面
- 闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
- 学习闭包的基本使用
- 标准的闭包具有不可变性:不能有状态,只能有常量和函数,而且函数只能有一个参数,但是一般可以不用严格遵守
- 使用闭包实现斐波那契数列
- 学习理解函数实现接口
- 使用函数遍历二叉树
具体代码示例如下:
packagemain import( "fmt" "io" "strings" "bufio" ) //普通闭包 funcadder()func(int)int{ sum:=0 returnfunc(vint)int{ sum+=v returnsum } } //无状态无变量的闭包 typeiAdderfunc(int)(int,iAdder) funcadder2(baseint)iAdder{ returnfunc(vint)(int,iAdder){ returnbase+v,adder2(base+v) } } //使用闭包实现斐波那契数列 funcFibonacci()func()int{ a,b:=0,1 returnfunc()int{ a,b=b,a+b returna } } //为函数实现接口,将上面的方法当作一个文件进行读取 typeintGenfunc()int //为所有上面这种类型的函数实现接口 func(gintGen)Read( p[]byte)(nint,errerror){ next:=g() ifnext>10000{ return0,io.EOF } s:=fmt.Sprintf("%d\n",next) //TODO:incorrectifpistoosmall! returnstrings.NewReader(s).Read(p) } //通过Reader读取文件 funcprintFileContents(readerio.Reader){ scanner:=bufio.NewScanner(reader) forscanner.Scan(){ fmt.Println(scanner.Text()) } } funcmain(){ //普通闭包调用 a:=adder() fori:=0;i<10;i++{ varsint=a(i) fmt.Printf("0+...+%d=%d\n",i,s) } //状态无变量的闭包调用 b:=adder2(0) fori:=0;i<10;i++{ varsint s,b=b(i) fmt.Printf("0+...+%d=%d\n",i,s) } //调用斐波那契数列生成 fib:=Fibonacci() fmt.Println(fib(),fib(),fib(),fib(),fib(),fib(),fib(),fib()) varfintGen=Fibonacci() printFileContents(f) }
以下代码演示函数遍历二叉树:
packagemain import"fmt" typeNodestruct{ Valueint Left,Right*Node } func(nodeNode)Print(){ fmt.Print(node.Value,"") } func(node*Node)SetValue(valueint){ ifnode==nil{ fmt.Println("SettingValuetonil"+ "node.Ignored.") return } node.Value=value } funcCreateNode(valueint)*Node{ return&Node{Value:value} } //为TraverseFunc方法提供实现 func(node*Node)Traverse(){ node.TraverseFunc(func(n*Node){ n.Print() }) fmt.Println() } //为Node结构增加一个方法TraverseFunc, //此方法传入一个方法参数,在遍历是执行 func(node*Node)TraverseFunc(ffunc(*Node)){ ifnode==nil{ return } node.Left.TraverseFunc(f) f(node) node.Right.TraverseFunc(f) } funcmain(){ varrootNode root=Node{Value:3} root.Left=&Node{} root.Right=&Node{5,nil,nil} root.Right.Left=new(Node) root.Left.Right=CreateNode(2) root.Right.Left.SetValue(4) root.Traverse()//进行了打印封装 //以下通过匿名函数,实现了自定义实现 nodeCount:=0 root.TraverseFunc(func(node*Node){ nodeCount++ }) fmt.Println("Nodecount:",nodeCount)//Nodecount:5 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。