函数高级玩法
2019-05-09 本文已影响0人
mick_
函数的功能
- 是一种对一组输入,输出进行模板化的重要工具,比接口类型更加轻量级,灵活
- 函数主要用于封装代码块,分割功能,解耦逻辑,由于够支持头等函数,所以还可以化身为普通函数,在其他函数间传递,赋值变量,做类型判断和转换(函数值可当成随意传播的独立组建)
头等公民
支持头等函数的编程语言,可以把函数赋值给变量,也可以把函数作为其他函数的参数或返回值,go语言支持这种机制,故称为头等函数。
函数签名
函数签名是指函数的参数列表+结果列表的统称,只要参数列表+结果列表一致即可认为函数签名相同,主要用于鉴别不同函数的特征,同事也定义了我们与函数的交互方式(即怎么使用函数)
高阶函数
高阶函数是指满足 接受其他的函数作为参数传入或 把其他的函数作为结果返回即可认为是高阶函数
闭包函数
若一个函数引用的自由变量,并被当做参数或结果使用,则此函数被称为闭包函数
自由变量是指变量不在函数的参数或结果中,也不再函数体中声明,是外部变量的引用,则此变量在闭包中被称为自由变量
61f3689a0023e83407ccae081cdd8108.png
闭包的意义? 表面上看仅仅是延迟实现了一部分程序的逻辑或功能而已,实际上,我们是在动态的生成部分程序逻辑
案例-斐波那契
// 1 1 2 3 5 8
func fibonacci()func()int{
a,b :=0,1
return func()int{
a,b = b,a+b
return b
}
}
案例-函数实现接口
type Reader interface{
Read()
}
type MyReader func()
func(m MyReader) Read(){
fmt.Println("hello")
}
func PrintReader(r Reader){
r.Read()
}
func main(){
var m MyReader
PrintReader(m)
}
案例-左右遍历
type Node struct{
left *Node
name string
right *Node
}
func(n *Node) Traverse(){
if n == nil{
return
}
n.left.Traverse()
fmt.Println(n.name)
n.right.Traverse()
}
func main(){
n := Node{
name:"parent",
left:&Node{name:"left"},
right:&Node{name:"right"},
}
n.Traverse()
}