课程名称:GO开发工程师
课程章节:2-1函数式编程;2-2函数式编程例1;2-3函数式编程例2
课程讲师: ccmouse
课程内容:
函数编程:
参数、变量、返回值都可以是函数
函数指针:
C++里只能使用函数指针,不能将函数直接传递给别人
正统函数式编程:
1. 不可变性:不能有状态,只有常量与函数
2. 函数只能有一个参数
闭包:
函数体内的自由变量链接到了函数体外部,整个结构称之为闭包
go 语言不是正统的函数式编程
斐波拉契数列(为函数实现接口)
func fibonacci() intGen {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
type intGen func() int
// 函数是一定公民,也能实现接口
// 实现IO Reader 的read方法
func (g intGen) Read(p []byte) (n int, err error) {
next := g()
if next > 10000 {
return 0, io.EOF // io.EOF 到达文件尾部
}
//使用strings Reader代理读取输入的数字
s := fmt.Sprintf("%d\n", next) // 1\n 1\n 2\n
return strings.NewReader(s).Read(p)
}
使用函数来遍历二叉树
func (node *Node) Traverse() {
// 使用函数遍历"二叉树"
node.TraverseFunc(func(n *Node) {
n.Print()
})
}
func (node *Node) TraverseFunc(f func(*Node)) {
if node == nil {
return
}
// 中序遍历,左->中->右
node.Left.TraverseFunc(f)
f(node) // 不用关心外部函数怎么实现,只管调用
node.Right.TraverseFunc(f)
}
课程收获:
函数是一等公民,也能实现接口。
使用函数传参,实现者内部无需关心外部函数具体实现,外部使用者可以做更多定制化的操作。
使用strings Reader代理读取输入的数字。
io.EOF 到达文件尾部。