Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么?
围绕“Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单个数值的增减读用 atomic 更轻量、涉及多个变量的一致性必须加锁。
Go面试题第 1 页,显示第 1–35 题,共找到 35 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单个数值的增减读用 atomic 更轻量、涉及多个变量的一致性必须加锁。
围绕“Go 的带缓冲 channel 缓冲满了和空了分别会怎样,缓冲大小如何影响并发行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明满则发送阻塞、空则接收阻塞、缓冲量决定解耦程度但不改变最终同步语义。
围绕“Go 中函数参数把 channel 声明为只读或只写有什么作用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明方向性 channel 类型在编译期限制误用、表达生产者消费者契约。
围绕“Go 中关闭 channel 的正确姿势是什么,哪些操作会 panic”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖明确向已关闭 channel 发送或重复关闭会 panic、接收方用 v, ok 判关闭、应由发送方关闭。
围绕“Go 的 context.WithCancel 和 WithTimeout 的取消信号如何在调用链中传播”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明父 context 取消级联到所有子 context、子监听 Done 退出、必须调用 cancel 释放资源。
围绕“为什么 Go 官方建议不要把 context 存进结构体字段,而要做函数第一个参数”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 context 生命周期跟随单次请求而非对象、存字段会造成取消语义混乱,net/http Handler 等例外从 Reque。
围绕“Go 中用 defer 关闭文件、连接等资源时,多个 defer 的执行顺序和错误处理要注意什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 defer 后进先出执行、关闭错误不应被静默吞掉可通过命名返回值记录。
围绕“Go 的 defer 参数何时求值,defer 在循环里累积会有什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 defer 注册时即求值参数、循环中延迟到函数返回才执行导致资源堆积。
围绕“Go 的空接口 interface{}(any)能存任何值,滥用它有什么代价”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断 any 牺牲编译期类型检查、需要运行时断言,适合打印等通用场景但不适合业务 API。
围绕“Go 中什么时候返回 error、什么时候 panic,recover 应该用在哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕划定可预期失败走 error、不可恢复的程序错误才 panic、recover 限于 goroutine 边界兜底。
围绕“Go 的 fmt.Errorf %w 包装错误和 errors.Unwrap、Is、As 如何配合工作”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清包装链上 Is 按值比较、As 按类型提取的区别与用法。
围绕“Go 中 runtime.Goexit 和 return 结束 goroutine 有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Goexit 终止当前 goroutine 但仍执行已注册 defer、不影响其他 goroutine,主 goroutine。
围绕“Go 在循环里启动 goroutine 捕获循环变量会有什么结果,Go 1.22 前后有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 1.22 之前共享同一变量导致全是最终值、1.22 起每次迭代新建变量,以及显式传参写法。
围绕“Go 的 goroutine 为什么比操作系统线程轻量,调度上有什么关键设计”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答小初始栈可增长、M:N 调度与协作加抢占。
围绕“Go 的接口是隐式实现的,这带来哪些设计上的好处和风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断隐式满足带来解耦但也可能意外实现错误接口,提编译期断言 var _ Iface = (*T)(nil)。
围绕“Go 中接口值为 nil 和接口持有 nil 指针有什么区别,为什么 == nil 判断会失效”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释接口由类型和值两部分组成、持有 nil 指针的接口不等于 nil 的判定。
围绕“Go 接口变量赋值和比较的开销与限制是什么,什么时候接口不可比较”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明接口相等要求动态类型和值都相等、动态值不可比较时会 panic。
围绕“Go 程序 main 函数返回后,还在运行的 goroutine 会怎样,如何正确等待它们”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖明确进程退出即所有 goroutine 被强杀,需要用 WaitGroup 或 channel 等待收尾。
本题分析 Go map 并发写失败的机制,说明如何通过锁或 sync.Map 改造,并指出哪些操作会触发,以及为什么不可 recover。
围绕“Go 在 range 遍历 map 过程中增删元素是安全的吗,结果如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单 goroutine 内边遍历边删除安全但新元素不保证被访问。
本文说明 Go map 遍历顺序的不确定性来源,并给出排序 key 的稳定输出方法,涉及 key 类型、排序规则和性能代价。
围绕“Go 读取 map 中不存在的 key 返回什么,如何区分「不存在」和「存的零值」”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明返回零值及 comma-ok 双返回值判存在的用法。
围绕“Go 为什么结构体里含 sync.Mutex 后不能再按值拷贝,go vet 如何发现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明拷贝锁会复制内部状态导致锁失效、应传指针或嵌入指针,vet 的 copylocks 检查可发现。
围绕“Go 的 sync.RWMutex 相比 Mutex 在什么读写比例下才值得用,有什么注意事项”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断读远多于写且临界区较长时 RWMutex 占优,注意不可重入与写饥饿风险。
本文解释Go中nil切片与空切片的本质区别,包括内部结构、与nil比较、JSON编码结果差异,并给出判空和序列化时的注意事项。通过具体场景演示为何使用len(s)==0更安全。
围绕“Go 的 select 在多个 case 同时就绪时怎么选择,default 分支带来什么行为变化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明多分支就绪时伪随机选择、default 使 select 变非阻塞及忙轮询风险。
本题说明切片len控制可视范围和索引边界,cap控制通过reslice或append可扩展的空间上限。通过具体条件示例解释当len等于cap时再reslice会被拒绝,以及append扩容后底层分离的后果。
本题解释Go子切片持有整个底层数组导致大内存无法释放的机制,并给出copy截断等避免方法。包含具体场景和边界判断,助你快速掌握切片内存管理。
围绕“Go 把切片传给函数,为什么函数内改元素生效而 append 不回传”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释切片头是值传递但底层数组共享这一机制下的两类不同表现。
围绕“Go 的 sync.Map 相比加锁的普通 map 适合什么场景,不适合什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断读多写少、key 集合相对固定时优势明显,需要计数或遍历时反而更差。
围绕“Go 的 sync.Once 如何保证初始化只执行一次,函数返回错误时还能重试吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Once 保证 exactly-once 且并发安全、失败的一次也算已执行不可自动重试,需要可重试时自行加锁。
本文解释 Go 中 make 嵌套创建二维切片时,修改一行是否影响其他行完全取决于内层切片是否共享底层数组,并给出安全创建方式。
围绕“Go 的类型断言和 type switch 分别在什么情况下使用,panic 如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单类型判断用带 ok 的断言、多类型分派用 switch,裸断言失败会 panic。
围绕“Go 的 sync.WaitGroup 的 Add、Done、Wait 调用位置有什么约束,常见错误有哪些”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕强调 Add 必须在启动 goroutine 之前调用、Add 与 Wait 不能并发竞态、计数不为负。
围绕“Go 用 channel 实现固定数量 worker 池处理任务时,如何正确关闭和收集结果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清任务 channel 关闭通知 worker 退出、WaitGroup 等待收尾、结果 channel 关闭时机的顺序。