Go语言闭包实现斐波那契生成器代码解析求助
Go斐波那契闭包生成器代码解析
整体代码结构说明
这段代码是利用Go的闭包特性实现的无额外传参依赖的斐波那契数生成器,调用时不需要传入任何参数,会自动按顺序返回下一个斐波那契数值。
外层函数逻辑
func makeFibGen() func() int:声明名为makeFibGen的函数,它的返回值是一个无参数、返回值为int类型的函数,也就是实际使用的斐波那契生成器。f1 := 0、f2 := 1:在外层函数内部初始化两个状态变量,这两个变量会被后续返回的闭包捕获,不会随着外层函数执行结束而被回收,会一直保存在闭包的上下文中存储生成进度。return func() int { ... }:返回一个匿名函数作为生成器实例,所有调用该匿名函数的操作都会复用上面捕获的f1、f2变量。
闭包内部逻辑
每次调用生成器时,内部会执行两步操作:
- 执行多重赋值更新状态变量
- 返回最新的斐波那契数值
核心多重赋值语句解析
f2, f1 = (f1 + f2), f2是整个生成器的核心逻辑,这里用到了Go语言的多重赋值特性,执行规则为:先计算等号右侧所有表达式的最终值,全部计算完成后再按位置一一赋值给左侧的变量,计算右侧值的过程中不会受到左侧变量赋值的影响。
实际执行效果拆解
我们可以用第一次调用生成器的初始状态(f1=0,f2=1)来演示执行过程:
- 先计算右侧两个表达式的值:
- 第一个表达式
f1 + f2用初始值计算结果为0+1=1 - 第二个表达式直接取
f2的初始值为1 - 得到右侧值序列为
[1, 1]
- 第一个表达式
- 按位置赋值给左侧变量:
- 第一个右侧值
1赋值给f2 - 第二个右侧值
1赋值给f1 - 赋值完成后状态更新为
f1=1,f2=1
- 第一个右侧值
- 最后执行
return f1,返回当前的斐波那契数值1
如果不用多重赋值实现相同逻辑,需要额外引入临时变量避免状态覆盖:
// 等价于 f2, f1 = (f1 + f2), f2 tmp := f1 + f2 oldF2 := f2 f2 = tmp f1 = oldF2
调用效果示例
同一个生成器实例的状态会持续保留,不同实例之间状态完全独立:
// 创建第一个生成器实例 gen1 := makeFibGen() fmt.Println(gen1()) // 1 fmt.Println(gen1()) // 1 fmt.Println(gen1()) // 2 // 创建第二个生成器实例,状态和gen1完全无关 gen2 := makeFibGen() fmt.Println(gen2()) // 1 fmt.Println(gen1()) // 3
内容的提问来源于stack exchange,提问作者suramana
相关产品推荐
相关产品推荐

