首页
技术小册
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 中,每个 goroutine 都有一个固定大小的栈空间,用于存储局部变量、函数调用信息等。栈空间的大小默认为 2KB,但可以使用 runtime.GOMAXPROCS 函数设置。 当 goroutine 需要的栈空间超过当前大小时,会触发栈空间的扩容。扩容时,Go 会在堆空间分配一个新的栈空间,并将旧的栈空间中的数据复制到新的栈空间中,然后将当前栈指针指向新的栈空间。栈空间的大小会以指数级别增长,以减少扩容的次数。 当 goroutine 的栈空间有很多闲置空间时,会触发栈空间的缩容。缩容时,Go 会将当前栈空间中未使用的空间释放回堆空间。 下面是一个简单的示例,展示了栈空间的扩容和缩容过程: ``` package main import ( "fmt" "runtime" ) func main() { var a [1024 * 1024]byte fmt.Println("stack:", &a[0], len(a)) go func() { var b [4 * 1024 * 1024]byte fmt.Println("stack:", &b[0], len(b)) }() for i := 0; i < 10; i++ { runtime.Gosched() } } ``` 在该示例中,我们定义了一个大小为 1MB 的数组 a,并打印出其地址和长度。然后启动一个新的 goroutine,在其中定义一个大小为 4MB 的数组 b,并打印出其地址和长度。最后,我们使用 runtime.Gosched() 函数让当前 goroutine 让出 CPU 执行时间,给其他 goroutine 执行的机会。我们循环执行 runtime.Gosched() 函数 10 次,以保证新的 goroutine 有足够的时间执行。 运行该示例,我们可以看到输出如下: ``` stack: 0xc000016090 1048576 stack: 0xc00004a090 4194304 ``` 可以看到,数组 a 所在的栈空间大小为 1MB,数组 b 所在的栈空间大小为 4MB。这表明,在 Go 中,不同的 goroutine 可以拥有不同大小的栈空间。另外,在输出中,我们还可以看到两个数组所在的地址不同,这表明它们分别位于不同的栈空间中。
上一篇:
说说你对 Go 里的抢占式调度的理解。
下一篇:
说一下 GMP 模型的原理。
该分类下的相关小册推荐:
Go 组件设计与实现
Go Web编程(下)
Go Web编程(上)
深入浅出Go语言核心编程(五)
深入解析go语言
Go语言从入门到实战
Golang并发编程实战
深入浅出Go语言核心编程(八)
企业级Go应用开发从零开始
深入浅出Go语言核心编程(七)
Go开发基础入门
go编程权威指南(三)