Go / Golang
Go 语言常见面试题及参考答案
Go 语言面试常见问题覆盖基础语法数据结构并发编程内存管理反射包管理与工具链陷阱使用建议等领域。内容包含 make 与 new 区别 slice 底层实现 map 线程安全 defer 执行顺序 struct 比较参数传递接口空接口 goroutine 线程区别 GMP 模型 sync 锁 channel 原理 select 语句超时控制 context 包 atomic 包竞态条件 sync.Once WaitGroup 服务关闭 fatal error deadlock 内存分配逃逸分析 GC 机制 STW gctrace 栈堆 finalizer 内存对齐 sync.Pool 手动触发 GC 反射优缺点 Go Modules go.mod go.sum go vet go lint pprof go:generate 构建标签类型断言 init 函数 flag 包单例模式项目结构等核心知识点解析。
一、基础语法与数据结构
1. make 和 new 的区别?
- 参考答案:
new(T):为类型 T 分配零值内存,返回指向该内存的指针 *T。它只分配内存,不初始化。
make(T):只能用于 slice、map 和 channel 这三种引用类型。它分配并初始化内存,返回的是类型 T 本身(一个已初始化的、非零值的结构),而不是指针。
- 解析:
new 很少使用,通常用 &T{} 结构体字面量替代。make 是创建这三种类型的标准方式,因为它们内部有复杂的数据结构需要初始化(如 slice 的 len、cap、指针数组)。
2. Go 语言的 slice 底层是如何实现的?
- 参考答案:
Go 的 slice 是一个结构体,在运行时包含三个字段:
- 一个指向底层数组的指针。