初学编程时候,总是在局部变量,全局变量,栈帧和闭包中懵懂游离,无法理解。比如下面最简单的程序:
package main
import "fmt"
func main() {
var avg, sum = 0.0, 0.0
fmt.Printf("初始化的avg=%v, sum=%v\n", avg, sum)
var score = []float64{12.5, 34.3, 56.6, 34.43, 74.43, 23.98}
avg = avgs(sum, score)
fmt.Printf("计算后的avg=%v, sum=%v\n", avg, sum)
}
func avgs(sum float64, score []float64) float64 {
for i := 0; i < len(score); i++ {
sum += score[i]
}
fmt.Printf("函数avgs中的sum=%v\n", sum)
return sum / float64(len(score))
}
运行结果是:
初始化的 avg=0, sum=0
函数avgs中的 sum=236.24
计算后的 avg=39.373333333333335, sum=0
在这里就会产生疑问,sum的值在函数avgs中改变,在函数结束后sum的值仍然为0。喜欢思考的同学就会疑问,我们对sum赋值操作了,怎么一会儿会改变,一会儿又不改变?通常老师的解释就是栈帧结构,但是这个结构如果不联想记忆的话就不好理解。其实在设计计算机的时候,处理事物的逻辑是模仿和适应我们人类的思维方式的,基于这一事实,我们把栈帧的内存类比成我们做题的“草稿纸”,我们在草稿纸上所有的计算过程在就算结束就会丢弃。如果在草稿纸上的计算过程改变了题目中的值,那么我们再做这道题就会引起混乱。
当然,这里的解释只是通俗口语说法,只是帮助初学的同学记忆和理解。总结起来就是:栈帧是按人类逻辑思维模式模拟的计算机的数据结构。