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
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。