Go语言变量的生周期
变量的生周期与变量的作用域有着不可分割的联系:
全局变量:它的生周期和整个程序的运行周期是一致的;
局部变量:它的生周期则是动态的,从创建这个变量的声明语句开始,到这个变量不再被引用为止;
形式参数和函数返回值:它们都属于局部变量,在函数被调用的时候创建,函数调用结束后被销毁。
上面代码中,在每次循环的开始会创建临时变量 t,然后在每次循环迭代中创建临时变量 x 和 y。临时变量 x、y 存放在栈中,随着函数执行结束(执行遇到一个for t := 0.0; t < cycles*2*math.Pi; t += res {
x := math.Sin(t)
y := math.Sin(t*freq + phase)
img.SetColorIndex(
size+int(x*size+0.5), size+int(y*size+0.5),
blackIndex, // 插入的逗号不会导致编译错误,这是Go编译器的一个特性
) // 小括号另起一行缩进,和大括号的风格保存一致
}
}),释放其内存。栈的概念在上一节《变量逃逸》中介绍过,它和堆的区别在于:
堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态加入到堆上(堆被扩张)。当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减);
- 栈(stack):栈又称堆栈, 用来存放程序暂时创建的局部变量,也就是我们函数的大括号
{ }中定义的局部变量。
在程序的编译阶段,编译器会根据实际情况自动选择在栈或者堆上分配局部变量的存储空间,不论使用 var 还是 new 关键字声明变量都不会影响编译器的选择。
上述代码中,函数 f 里的变量 x 必须在堆上分配,因为它在函数退出后依然可以通过包一级的 global 变量找到,虽然它是在函数内部定义的。用Go语言的术语说,这个局部变量 x 从函数 f 中逃逸了。var global *int
func f() {
var x int
x = 1
global = &x
}
func g() {
y := new(int)
*y = 1
}
相反,当函数 g 返回时,变量 *y 不再被使用,也就是说可以马上被回收的。因此,*y 并没有从函数 g 中逃逸,编译器可以选择在栈上分配 *y 的存储空间,也可以选择在堆上分配,然后由Go语言的 GC(垃圾回收机制)回收这个变量的内存空间。
在实际的开发中,并不需要刻意的实现变量的逃逸行为,因为逃逸的变量需要额外分配内存,同时对性能的优化可能会产生细微的影响。
虽然Go语言能够帮助我们完成对内存的分配和释放,但是为了能够开发出高性能的应用我们任然需要了解变量的声明周期。例如,如果将局部变量赋值给全局变量,将会阻止 GC 对这个局部变量的回收,导致不必要的内存占用,从而影响程序的性能。
- 随机文章
- 吉利小马尔代夫(吉利汽车进入马尔代夫市场,推出特别版SUV)
- 中印马尔代夫危机(危机缓解:中印马代表团访问马尔代夫)
- 商城马尔代夫海滩(马尔代夫商城沙滩——在这儿买买买!)
- 南昌马尔代夫晚上(南昌市民在夜晚尽情享受马尔代夫风情)
- 购买 马尔代夫 海岛(在马尔代夫探险:追寻海岛之美)
- 合肥马尔代夫图片(合肥一处神奇之地,仿若身处马尔代夫)
- 玉林 马尔代夫 门票(玉林一日游,带你体验马尔代夫风情)
- 广元马尔代夫荣山(广元荣山旅游集团将开拓马尔代夫市场)
- 日本旅游马尔代夫(日本游客最喜欢的度假胜地:马尔代夫)
- 日本马尔代夫入境(日本人前往马尔代夫需注意的入境事项)
- 俯瞰马尔代夫市区(鸟瞰马尔代夫中心城区:美景尽收眼底)
- 途牛 马尔代夫(途牛推出特价马尔代夫旅行方案)
- 渭南马尔代夫简介(渭南马尔代夫:中国最美的地下河之一)
- 海岛马尔代夫度假(追寻独特假期体验:探索马尔代夫海岛)
- 破产国家马尔代夫(马尔代夫面临破产的问题应当怎么解决)
- 渡假圣地马尔代夫(探索马尔代夫——一个完美的度假胜地)
- 航拍马尔代夫旅行(马尔代夫轻松出游:鸟瞰大片海天蓝!)
- 玉林马尔代夫项目(玉林打造马尔代夫主题度假村项目启动)
- 海南马尔代夫度假(海南有一个像马尔代夫一样的度假胜地)
- 白马马尔代夫酒店(重磅!马尔代夫白马度假村重新开业!)
- 行者走进马尔代夫(探秘马尔代夫:行者步入蓝色海洋世界)
- 嵊泗 马尔代夫(从嵊泗到马尔代夫:一个旅行家的海岛之旅)
- 青建 马尔代夫(青建承建马尔代夫项目达阶段性目标)
- 洲际马尔代夫项目(洲际酒店集团在马尔代夫揭幕新度假村)
- 马尔代夫主场球票(马尔代夫主场球票开售,快来预定吧!)
- 马尔代夫中国舰艇(中国海军首次在马尔代夫执行护航任务)
- 重庆洪峰马尔代夫(重庆洪峰过后,马尔代夫再现蓝天白云)
- 海龟视频马尔代夫(珊瑚岛海龟全景纪录视频惊艳马尔代夫)
- 马尔代夫住宿贵不(马尔代夫住宿费用高昂,但价值观优秀)
- 马尔代夫两沙三水(马尔代夫两岛三水被列入重点项目计划)
