49.笔记go语言——实现斐波那契
代码
实现代码如下:
package main
import "fmt"
// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func()int {
var a int = 1
var b int = 1
return func() int {
c := a+b
a = b
b = c
return c
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
执行
2
3
5
8
13
21
34
55
89
144
关于闭包
当不希望给函数起名字的时候,可以使用匿名函数,例如:func(x, y int) int { return x + y }
。
下面是一个计算从 1 到 1 百万整数的总和的匿名函数:
func() {
sum = 0.0
for i := 1; i <= 1e6; i++ {
sum += i
}
}()
表示参数列表的第一对括号必须紧挨着关键字 func,因为匿名函数没有名称。花括号 {} 涵盖着函数体,最后的一对括号表示对该匿名函数的调用。
下面的例子展示了如何将匿名函数赋值给变量并对其进行调用:
package main
import "fmt"
func main() {
f()
}
func f() {
for i := 0;i < 4; i++ {
g :=func(i int) { fmt.Printf("%d ", i) } //此例子中只是为了演示匿名函数可分配不同的内存地址,在现实开发中,不应该把该部分信息放置到循环中。
g(i)
fmt.Printf(" - g is of type %T and has value %v\n", g, g)
}
}
输出:
0 - g is of type func(int) and has value0x401180
1 - g is of type func(int) and has value0x401180
2 - g is of type func(int) and has value0x401180
3 - g is of type func(int) and has value0x401180
那么什么是闭包:
闭包函数出现的条件:
1.被嵌套的函数引用到非本函数的外部变量,而且这外部变量不是“全局变量”
2.嵌套的函数被独立了出来(被父函数返回或赋值 变成了独立的个体),
而被引用的变量所在的父函数已结束
PS:对象是附有行为的数据,而闭包是附有数据的行为。