这篇文章,通过两个简单的 go 程序,讲清楚了 Go 语言中 栈 和 指针的使用。

以下是阅读记录。

图1:主函数的栈空间

image1

图2:调用函数的栈空间

image2

图3:指针变量被调函数的帧空间(间接访问)

image3

  1. 帧边界为每个函数提供了它自己独有的内存空间,函数就是在这个内存空间执行的。
  2. 当调用函数时,上下文环境会在两个帧边界间切换。
  3. 按「值」传递的优点是可读性好。
  4. 栈,是非常重要的,因为它为分配给每个函数的帧边界提供了可访问的物理内存空间。【当我们说,你是在堆上,还是栈上,说的就是这个栈。】
  5. 在活动栈帧以下的栈空间是不可用的,只有活动栈和它之上的栈空间是可用的。【因为,栈是自上而下开始使用的。】
  6. 函数调用意味着 goroutine 需要在栈上为函数创建一个新的栈帧。
  7. 只有当发生函数调用,栈区块被分配的栈帧占用后,相应栈空间才会被初始化。【翻译一下就是,函数调用结束以后,不会立马清理栈空间,而是在这块栈空间再次被用到的时候才会被初始化。】
  8. 使用指针是为了和被调用函数共享变量,使「被调函数」可以用间接方式访问自己栈帧之外的变量。
  9. 每一个类型,不管是语言内置的还是用户定义的,都有一个与之对应的指针类型。
  10. 使用「指针」变量的函数,可以通过「指针」变量间接访问函数栈帧之外的内存。
  11. 指针变量和其他变量一样,并不特殊,同样是有一块内存,只不过指针变量上存放不是变量的值,而是变量的地址。

中文原文连接:https://studygolang.com/articles/12443

外文连接:https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html