当前位置:  首页>> 技术小册>> GO面试指南

Go 中默认使用的是分段栈(segmented stack),即将栈分为多个段,每个段的大小默认为 2KB。当栈空间不足时,会动态地增加栈的大小,以满足程序的需求。

与之相对的是连续栈(continuous stack),即将整个栈空间都分配给一个线程使用。在连续栈中,栈空间大小是固定的,不能动态地增加或减少。连续栈通常需要在程序启动时就分配好足够的栈空间,因此可能会浪费一部分内存空间。

以下是一个示例代码,展示了分段栈和连续栈的区别:

  1. package main
  2. import (
  3. "fmt"
  4. "runtime"
  5. )
  6. func main() {
  7. // 分段栈
  8. go func() {
  9. fmt.Println("分段栈开始")
  10. var a [1024 * 1024]byte
  11. for i := range a {
  12. a[i] = 1
  13. }
  14. fmt.Println("分段栈结束")
  15. }()
  16. // 连续栈
  17. go func() {
  18. fmt.Println("连续栈开始")
  19. var b [1024 * 1024 * 10]byte
  20. for i := range b {
  21. b[i] = 1
  22. }
  23. fmt.Println("连续栈结束")
  24. }()
  25. // 等待 goroutine 执行完毕
  26. runtime.Gosched()
  27. }

在这个示例代码中,我们创建了两个 goroutine,一个使用分段栈,一个使用连续栈。分段栈使用了一个长度为 1MB 的数组,而连续栈使用了一个长度为 10MB 的数组。在数组中,我们逐个设置了每个元素的值。

在运行程序时,我们可以看到如下输出:

  1. 分段栈开始
  2. 连续栈开始
  3. 分段栈结束

可以看到,分段栈执行完毕后,连续栈还没有执行完毕。这是因为连续栈的大小为 10MB,而默认情况下分段栈的大小为 2KB,因此分段栈的空间被占用完毕后,Go 运行时会动态地增加分段栈的大小,而不是像连续栈那样使用固定的栈空间。

需要注意的是,分段栈和连续栈的区别在于栈的内存分配方式,对于程序的运行和编写来说并没有太大的影响。因此,在编写程序时应该尽量避免使用过多的栈空间,以减少栈溢出等问题的发生。


该分类下的相关小册推荐: