一、 函数。
go语言中函数定义形式类似于python中的函数,如下是go语言中的函数定义:
func myfun() string {
return ""
}
这是一个普通函数的定义,与其他语言一样,是一个代码块。
二、 函数是一等公民
上面说了go语言的函数是一个代码块,其实go语言中的函数与数据类型一样属于一等功能,他不光是一个代码块,他可以作为参数返回,传入等等。如下我们来写一个函数是一等公民的例子:
func myfun() func(){
return func() {
fmt.Println("函数被调用了")
}
}
该函数的返回值是一个函数,这个函数需要一个函数类型变量来接收:
a := myfun() //返回一值是一个函数
a() //调用函数
如上是这个函数的具体操作。
三、 闭包。
函数成为一等公民,那么闭包的概念自然而然就要出来了。闭包的概念需要包括自由变量,局部变量,如下:
func myfun1() func(int) int{// 函数体
sum := 0 //自由变量,只要被内部调用了就不会被释放
return func(i int) int{ // i 是局部变量
sum += i
return sum
}
}
如上是一个闭包,闭包是一个结构,他被指向的这个变量只要不换指向,那么自由变量就不会被释放,如下看:
f := myfun1()//同样的函数调用
fmt.Println(f(1)) // 1
fmt.Println(f(5)) // 1 + 5
myfun1()//函数调用完了内部变量就被释放了,不会被继续调用,除了自由变量。
四、 函数式编程。
将函数作为一等公民,go语言支持函数式编程,函数式编程是与命令式编程对立的一种编程方式,这种方式我现在无法理解透彻,做个基本的函数式编程操作吧:
type myfun func(int) (int,myfun)
func dofun (base int) myfun {
return func(i int) (int, myfun) {
return base + i, dofun(base + i)
}
}
采用递归的编程方式实现与上述加和的策略。
五、 闭包的应用。
这里就写一个简单的应用吧,函数编程真的需要时间。
斐波拉契;
func fib() func() int{
a,b := 0,1
return func() int {
a,b = b,a+b//内部调用
return a
}
}
我想采用函数式编程个概念来改写:(对函数式编程还是不理解,以后来写吧。)