[转载]Go 语言机制之栈与指针
这篇文章,通过两个简单的 go 程序,讲清楚了 Go 语言中 栈 和 指针的使用。
以下是阅读记录。
图1:主函数的栈空间
图2:调用函数的栈空间
图3:指针变量被调函数的帧空间(间接访问)
- 帧边界为每个函数提供了它自己独有的内存空间,函数就是在这个内存空间执行的。
- 当调用函数时,上下文环境会在两个帧边界间切换。
- 按「值」传递的优点是可读性好。
- 栈,是非常重要的,因为它为分配给每个函数的帧边界提供了可访问的物理内存空间。【当我们说,你是在堆上,还是栈上,说的就是这个栈。】
- 在活动栈帧以下的栈空间是不可用的,只有活动栈和它之上的栈空间是可用的。【因为,栈是自上而下开始使用的。】
- 函数调用意味着 goroutine 需要在栈上为函数创建一个新的栈帧。
- 只有当发生函数调用,栈区块被分配的栈帧占用后,相应栈空间才会被初始化。【翻译一下就是,函数调用结束以后,不会立马清理栈空间,而是在这块栈空间再次被用到的时候才会被初始化。】
- 使用指针是为了和被调用函数共享变量,使「被调函数」可以用间接方式访问自己栈帧之外的变量。
- 每一个类型,不管是语言内置的还是用户定义的,都有一个与之对应的指针类型。
- 使用「指针」变量的函数,可以通过「指针」变量间接访问函数栈帧之外的内存。
- 指针变量和其他变量一样,并不特殊,同样是有一块内存,只不过指针变量上存放不是变量的值,而是变量的地址。
中文原文连接:https://studygolang.com/articles/12443
外文连接:https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html
- 原文作者:Kevin
- 原文链接:http://www.subond.com/post/2023-08-15_go_stack/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。