首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Go 中的 = 和 := 有什么区别?
Go 中的指针的意义是什么?
Go 多值返回有什么用?
Go 有异常类型吗?
Go 中的 rune 和 byte 有什么区别?
Go 语言中的深拷贝和浅拷贝?
什么叫字面量和组合字面量?
对象选择器自动解引用怎么用?
map 的值不可寻址,那如何修改值的属性?
有类型常量和无类型常量的区别?
为什么传参使用切片而不使用数组?
Go 语言中 hot path 有什么用呢?
引用类型与指针,有什么不同?
Go 是值传递,还是引用传递、指针传递?
Go中哪些是可寻址,哪些是不可寻址的?
slice 扩容后容量及内存如何计算?
goroutine 存在的意义是什么?
说说 Go 中闭包的底层原理?
defer 的变量快照什么情况会失效?
说说你对 Go 里的抢占式调度的理解。
简述一下 Go 栈空间的扩容/缩容过程?
说一下 GMP 模型的原理。
GMP 模型为什么要有 P ?
不分配内存的指针类型能用吗?
如何让在强制转换类型时不发生内存拷贝?
Go 中的 GC 演变是怎样的?
Go 中哪些动作会触发 runtime 调度?
有哪些情况会导致协程泄露?
局部变量分配在栈上还是堆上?
为什么常量、字符串和字典不可寻址?
为什么 slice 元素是可寻址的?
Go 的默认栈大小是多少?最大值多少?
Go 中的分段栈和连续栈的区别?
内存对齐、内存布局是怎么回事?
Go 里是怎么比较相等与否?
所有的 T 类型都有 *T 类型吗?
数组对比切片有哪些优势?
GMP 偷取 G 为什么不需要加锁?
堆引用栈内存是怎么回收的?
当前位置:
首页>>
技术小册>>
GO面试指南
小册名称:GO面试指南
Go 中默认使用的是分段栈(segmented stack),即将栈分为多个段,每个段的大小默认为 2KB。当栈空间不足时,会动态地增加栈的大小,以满足程序的需求。 与之相对的是连续栈(continuous stack),即将整个栈空间都分配给一个线程使用。在连续栈中,栈空间大小是固定的,不能动态地增加或减少。连续栈通常需要在程序启动时就分配好足够的栈空间,因此可能会浪费一部分内存空间。 以下是一个示例代码,展示了分段栈和连续栈的区别: ``` package main import ( "fmt" "runtime" ) func main() { // 分段栈 go func() { fmt.Println("分段栈开始") var a [1024 * 1024]byte for i := range a { a[i] = 1 } fmt.Println("分段栈结束") }() // 连续栈 go func() { fmt.Println("连续栈开始") var b [1024 * 1024 * 10]byte for i := range b { b[i] = 1 } fmt.Println("连续栈结束") }() // 等待 goroutine 执行完毕 runtime.Gosched() } ``` 在这个示例代码中,我们创建了两个 goroutine,一个使用分段栈,一个使用连续栈。分段栈使用了一个长度为 1MB 的数组,而连续栈使用了一个长度为 10MB 的数组。在数组中,我们逐个设置了每个元素的值。 在运行程序时,我们可以看到如下输出: ``` 分段栈开始 连续栈开始 分段栈结束 ``` 可以看到,分段栈执行完毕后,连续栈还没有执行完毕。这是因为连续栈的大小为 10MB,而默认情况下分段栈的大小为 2KB,因此分段栈的空间被占用完毕后,Go 运行时会动态地增加分段栈的大小,而不是像连续栈那样使用固定的栈空间。 需要注意的是,分段栈和连续栈的区别在于栈的内存分配方式,对于程序的运行和编写来说并没有太大的影响。因此,在编写程序时应该尽量避免使用过多的栈空间,以减少栈溢出等问题的发生。
上一篇:
Go 的默认栈大小是多少?最大值多少?
下一篇:
内存对齐、内存布局是怎么回事?
该分类下的相关小册推荐:
Go语言从入门到实战
深入浅出Go语言核心编程(二)
Go Web编程(中)
go编程权威指南(四)
Go-Web编程实战
go编程权威指南(三)
Go 组件设计与实现
深入浅出Go语言核心编程(五)
从零写一个基于go语言的Web框架
Go语言入门实战经典
Go开发权威指南(上)
Go开发基础入门