Go语言变量的生命周期是啥

在Go语言中,变量的生命周期指的是在程序运行期间变量有效存在的时间间隔。全局变量的生命周期和整个程序的运行周期是一致的;局部变量的生命周期则是动态的,从创建这个变量的声明语句开始,到这个变量不再被引用为止。

Go语言变量的生命周期是啥

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go语言变量的生命周期

变量的生命周期指的是在程序运行期间变量有效存在的时间间隔。

变量的生命周期与变量的作用域有着不可分割的联系:

立即学习“go语言免费学习笔记(深入)”;

全局变量:它的生命周期和整个程序的运行周期是一致的;

局部变量:它的生命周期则是动态的,从创建这个变量的声明语句开始,到这个变量不再被引用为止;

形式参数和函数返回值:它们都属于局部变量,在函数被调用的时候创建,函数调用结束后被销毁。

for t := 0.0; t 

上面代码中,在每次循环的开始会创建临时变量 t,然后在每次循环迭代中创建临时变量 x 和 y。临时变量 x、y 存放在栈中,随着函数执行结束(执行遇到最后一个}),释放其内存。

栈和堆的区别在于:

登录后复制

堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态加入到堆上(堆被扩张)。当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减);

栈(stack):栈又称堆栈, 用来存放程序暂时创建的局部变量,也就是我们函数的大括号{ }中定义的局部变量。

在程序的编译阶段,编译器会根据实际情况自动选择在栈或者堆上分配局部变量的存储空间,不论使用 var 还是 new 关键字声明变量都不会影响编译器的选择。

var global *intfunc f() {    var x int    x = 1    global = &x}func g() {    y := new(int)    *y = 1}

登录后复制

上述代码中,函数 f 里的变量 x 必须在堆上分配,因为它在函数退出后依然可以通过包一级的 global 变量找到,虽然它是在函数内部定义的。用Go语言的术语说,这个局部变量 x 从函数 f 中逃逸了。

相反,当函数 g 返回时,变量 *y 不再被使用,也就是说可以马上被回收的。因此,*y 并没有从函数 g 中逃逸,编译器可以选择在栈上分配 *y 的存储空间,也可以选择在堆上分配,然后由Go语言的 GC(垃圾回收机制)回收这个变量的内存空间。

在实际的开发中,并不需要刻意的实现变量的逃逸行为,因为逃逸的变量需要额外分配内存,同时对性能的优化可能会产生细微的影响。

虽然Go语言能够帮助我们完成对内存的分配和释放,但是为了能够开发出高性能的应用我们任然需要了解变量的声明周期。例如,如果将局部变量赋值给全局变量,将会阻止 GC 对这个局部变量的回收,导致不必要的内存占用,从而影响程序的性能。

【相关推荐:Go视频教程、编程教学】

以上就是Go语言变量的生命周期是啥的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2415308.html

(0)
上一篇 2025年3月3日 00:55:59
下一篇 2025年2月27日 14:21:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • go语言怎么替换字符串

    在go语言中,可以利用strings包的Replace()函数来替换字符串,语法“strings.Replace(原字符串,要搜索的值,替换值,替换次数)”;如果替换次数为负数,那么表明将字符串中所有的指定子串全部替换成新值。 本教程操作环…

    2025年3月3日 编程技术
    200
  • golang中堆与栈的区别是什么

    堆与栈的区别:1、堆是用于存放进程执行中被动态分配的内存段,而栈是用来存放程序暂时创建的局部变量;2、堆内存的生命周期比栈内存要长;3、堆内存相比栈内存来说,不能自动被编译器释放,只能通过垃圾回收器才能释放。 本教程操作环境:windows…

    2025年3月3日
    200
  • Go语言类型别名是什么

    在Go语言中,类型别名就是为已存在的“类型”定义一个别名,可以使用type关键字来定义,语法“type TypeAlias = Type”。类型别名是Go 1.9版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题;在 C/C…

    2025年3月3日
    200
  • Go语言怎么导入包

    在Go语言中,可以通过import语句来导入包,导入的包名使用双引号包围,包名是从GOPATH开始计算的路径,使用“/”进行路径分隔。使用import导入包有两种基本格式:1、单行导入语法“import “bao1”…

    2025年3月3日
    200
  • Go中并发和并行的区别是什么

    并发和并行的区别:1、并发是把任务在不同的时间点交给处理器进行处理,而并行是把每一个任务分配给每一个处理器独立完成;2、并发中在同一时间点,任务并不会同时运行,而并行中,在同一时间点,任务一定是同时运行。 本教程操作环境:windows7系…

    2025年3月3日
    200
  • goroutine和coroutine的区别是什么

    区别:1、goroutine通过通道来通信,coroutine通过让出和恢复操作来通信。2、goroutine协程间不完全同步,可以利用多核并行运行;coroutine协程间完全同步,不会并行。3、goroutine可在多个协程/线程上切换…

    2025年3月3日
    200
  • Go语言中chan通道是什么

    在Go语言中,通道(chan)是goroutine之间通信的管道,是goroutine与另一个goroutine通信的媒介。通道是一种技术,它允许一个goroutine将数据发送到另一个goroutine;默认情况下,通道是双向的,这意味着…

    2025年3月3日
    200
  • Go语言常用内置包有哪些

    常用内置包:1、fmt,可实现格式化的标准输入输出;2、io;3、bufio;4、sort;5、strconv;6、os;7、sync;8、flag;9、encoding/json;10、html/template;11、net/http;…

    2025年3月3日
    200
  • Go语言中什么是包

    包(package)是多个Go源码的集合,是一种高级的代码复用方案。Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称;包可以定义在很深的目录中,包名的定义是不包括目录路径的,但是包在引用时一般使用全路径引用。 本教…

    2025年3月3日
    200
  • go语言接口类型怎么转换

    go语言可利用类型断言来进行接口类型。在Go中,无论是将一个接口类型转换成另一个接口类型,还是将一个接口转换为另一个基本类型,都必须需要使用 类型断言;转换语法有两种“转换后的变量 := 接口变量.(目标类型)”和“转换后的变量 , ok …

    2025年3月3日
    200

发表回复

登录后才能评论