Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么?
围绕“Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单个数值的增减读用 atomic 更轻量、涉及多个变量的一致性必须加锁。
并发编程专题面试题第 3 页,显示第 101–150 题,共找到 448 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“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 关闭时机的顺序。
本题解释If-Match与If-Unmodified-Since在写操作中的乐观锁机制:服务器写前校验失败返回412,并对比时间戳秒级局限与ETag强验证的可靠性,给出优先用ETag的建议。
围绕“Service Worker 的 Cache Storage 与浏览器 HTTP 缓存是两套机制,fetch 时默认”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲清 fetch 事件拦截与 HTTP 缓存检查的先后关系及只在一层做策略的原则,不写 Service Worker 代码。
围绕“HTTP 409 Conflict 的语义是什么,版本控制冲突场景下如何使用它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明状态冲突语义及乐观锁冲突的典型应用。
本题解释 HTTP PUT 与 PATCH 的语义核心区别:PUT 是完整替换且幂等,PATCH 是部分修改且不保证幂等。内容涵盖各自适用场景、具体工程示例、以及并发控制边界,帮助理解何时用 PUT 或 PATCH 以及它们的幂等性含义。
围绕“HTTP/1.1 时代为绕过并发限制有哪些优化手段,各自的代价是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖完整回答要覆盖多开连接、域名分片、资源合并与内联,并指出它们与缓存粒度和连接开销的矛盾。
围绕“HTTP/2 的 SETTINGS_MAX_CONCURRENT_STREAMS 如何影响客户端并发发送”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲服务端通过 SETTINGS 帧限制并发流数与客户端排队行为,以及该值对代理合并连接的影响。
围绕“高并发短连接下服务器大量 TIME_WAIT 如何定位和缓解”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分主动关闭方才会产生 TIME_WAIT,并给出连接复用、调整谁主动关闭等方案,不泛泛谈内核参数清单。
围绕“CompletableFuture 不指定 Executor 会有什么隐患,IO 型异步任务该如何选线程池”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断默认 commonPool 对阻塞任务的饥饿风险及显式 Executor 的必要性。
围绕“ConcurrentHashMap 在 Java 8 之后为什么用 CAS 加 synchronized 取代分段锁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明桶级锁与 CAS 无锁化带来的并发度提升及 size 统计方式变化。
围绕“在 for 循环中对多个异步任务使用 await,是串行执行吗?如何改为并发”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明每个 await 会阻塞循环体,使用 Promise.all 改为并发。
围绕“并发池中任务完成的结果顺序如何保证与发起顺序一致?有哪些实现方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明使用索引或预填充数组保持顺序。
围绕“设计一个并发池:如何用 Promise 实现限制最大并发数的异步任务调度器”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出队列与计数器设计思路,不包含具体库的实现。
围绕“多个 Promise 并发执行时,它们的 then 回调是否一定按照 Promise 完成的顺序触发”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明回调按完成顺序进入微任务队列,不是按调用顺序,但若同时加入则按代码顺序。
通过同一数组对照 for...of 与 forEach 的跳过和终止,解释回调 return 的作用域、稀疏数组和 async 回调陷阱,并给出查找、顺序等待与并发处理的选择依据。
围绕“Kubernetes 用环境变量注入 Secret 比挂载文件多了哪些泄露风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较 env 在崩溃日志、子进程继承中的暴露面与 volume 的权限控制差异。