go简化版面试题
6、内存溢出,内存泄漏,内存逃逸
内存溢出:超出给定内存。
递归没有结束(申请太多对象)
一次性加载超大文件或数据集到内存(如未分页读取)。
大量请求导致内存分配超出系统限制(如未合理设置容器内存上限)。
如无限增长的全局缓存
排查:
-
容器环境查看 Docker/K8s 内存指标(
docker stats
或kubectl top pods
)。 -
使用
go tool pprof -http=:8080 heap.pprof
分析内存分配热点。
内存泄漏:有些资源没有释放。 文件没有关闭
处理文件,一次性加载过多在内存中
缓存数据无过期策略(如 map
只增不减)。
创建更多的goroutin
排查:
-
检查全局变量、缓存、第三方库(如 CGO 资源管理)。
-
使用
defer
确保资源释放(如defer file.Close()
)。 -
检查 Goroutine 数量:
http://localhost:6060/debug/pprof/goroutine?debug=1
查看 Goroutine 堆栈。
内存逃逸:本来应该分配在栈上时,由于某些原因,它们被分配到了堆上。变量分配到堆上时可能增加 GC 压力,导致内存消耗增大。
func escapeExample() *int {
x := 10 // x 是局部变量
return &x // x 的地址被返回,逃逸到堆
}
怎么避免
不要直接返回局部变量的指针。如果需要返回数据,可以直接返回值。
排查
用 pprof
查看堆内存分配
1.2、什么是MVC
1. 用户通过界面(View)进行操作(比如点击按钮或输入 URL)。
2. Controller 接收用户输入,调用 Model 处理业务逻辑或数据库操作。
3. Model 返回结果,Controller 再将结果传递给 View。
4. View 根据数据渲染页面并展示给用户。
5、context
- Context 的数据结构包含 Deadline,Done,Err,Value,
- Deadline 方法返回一个 time.Time,表示当前 Context 应该结束的时间,ok 则表示有结束时间,
- Done 方法当 Context 被某一个操作进行了取消或者超时时候返回的一个 close 的 channel,告诉给 context 相关的函数要停止当前工作然后返回了,
- Err 表示 context 被取消的原因,
- Value 方法表示 context 实现共享数据存储的地方,
- 协程安全的。
9.3、defer关闭资源时,程序中断会被会被关闭吗?
-
defer
在以下情况会执行:-
正常退出。
-
panic
崩溃(当前函数的defer
)。 -
捕获中断信号(如
Ctrl+C
)。
-
-
defer
在以下情况不会执行:-
os.Exit
退出。 -
强制终止(如
kill -9
)。
-
11、Go 多返回值怎么实现的?
-
Go 的多返回值是通过 栈 来实现的
-
函数的多返回值会被依次压入调用栈中。