闭包函数实现斐波那契数列
package main
import "fmt"
// 方式1:
func main() {
var g int
num := 3
func(i int) {
if num <= 2 {
g = 1
} else {
for m, n, j := 0, 1, 1; j < i; j++ {
g = m + n
m = n
n = g
}
}
}(num)
fmt.Printf("第 %d 个斐波那契数为:%d\n", num, g) // Passes argument 1000 to the function literal.
}
// 方式2:
func cloForFib(num int) int {
var g int
go func(num int) {
if num <= 2 {
g = 1
} else {
for m, n, j := 0, 1, 1; j < num; j++ {
g = m + n
m = n
n = g
}
}
}(num)
return g
}
func main() {
num := 10
g := cloForFib(num)
fmt.Printf("第 %d 个斐波那契数为:%d\n", num, g)
}
问题在第二个用协程去做计算,g 是函数内的局部变量,返回到 main 函数的 g 值为 0, 且与协程中 g 的地址不一样所以协程完成计算后的值没法赋值到 main 中的 g。如果设置为全局变量可以解决这个问题。
在闭包中,如果有函数对变量进行引用的时候这个变量就会溢出到堆中变成全局变量,所以这里不是局部变量的问题,问题出在了协程,协程还没运行结束但是原方法已经退出了,所以这里可以用waitgroup解决。