-
Go语言的context通过树状结构传播取消信号,实现协程间的统一控制。context内部维护done通道,当调用cancel函数时关闭该通道,所有监听该context的goroutine都会收到信号并退出。超时和截止时间本质也是通过定时器触发cancel实现。相似问题及优化建议:context为什么要传递下去?如何避免context滥用?高并发服务如何统一取消任务?
-
Mutex基于自旋锁与信号量机制实现。在竞争不激烈时使用自旋优化,竞争激烈时进入休眠等待队列,通过runtime调度器唤醒,减少CPU消耗。相似问题及优化建议:Mutex和RWMutex区别是什么?锁竞争严重怎么办?如何减少锁粒度提升性能?
-
可以通过减少内存分配、使用对象池、调整GOGC参数优化GC。pprof和trace工具可以分析内存分配热点,从而针对性优化。相似问题及优化建议:如何查看GC日志?GOGC参数如何设置?如何减少内存抖动?
-
RWMutex允许多个读锁同时存在,但写锁是独占的。当有写锁请求时,新的读锁会被阻塞,避免写锁饥饿问题。适用于读多写少场景。相似问题及优化建议:读写锁适合什么场景?如何避免写锁饥饿?高并发下如何优化锁使用?
-
Go语言的channel底层由hchan结构体实现,内部包含循环队列、发送队列和接收队列,用于实现协程之间的安全通信。当向channel发送数据时,如果缓冲区未满则直接写入;如果已满则将当前goroutine加入发送等待队列。接收数据时若缓冲区为空,则加入接收等待队列。底层通过锁保证并发安全,并结合调度器实现阻塞与唤醒机制。相似问题及优化建议:无缓冲channel和有缓冲channel区别是什么?channel为什么会阻塞?如何避免channel死锁?合理关闭channel并控制发送接收顺序。
-
Go语言的GMP调度模型由G(goroutine)、M(操作系统线程)、P(逻辑处理器)三部分组成,通过本地队列、全局队列以及工作窃取机制实现高效并发调度。G代表待执行的协程任务,M负责真正执行代码,P维护可运行G的队列并与M绑定。每个P优先执行本地队列中的G,当队列为空时会从全局队列或其他P中窃取任务实现负载均衡。调度器结合抢占式机制与netpoll网络轮询器,避免长时间占用CPU。GOMAXPROCS决定P的数量,从而控制并发度。相似问题及优化建议:GOMAXPROCS设置多少合适?一般建议
-
WaitGroup通过计数器和信号量实现协程同步。Add增加计数,Done减少计数,当计数为0时唤醒等待的goroutine。底层使用atomic操作保证线程安全。相似问题及优化建议:WaitGroup使用错误会导致什么问题?如何避免负数计数?协程同步有哪些方式?
-
select在多个case满足条件时通过伪随机顺序遍历case列表,避免饥饿问题。runtime会对case顺序进行打乱,并检测可执行分支。若无可执行case且无default,则当前goroutine进入等待队列。该机制保证并发公平性。相似问题及优化建议:select是否绝对公平?select如何避免阻塞?如何优化复杂select结构?
-
Once通过atomic标志位和Mutex结合实现。首次调用执行函数并设置标志位,后续调用直接返回,保证线程安全。相似问题及优化建议:Once是否可以重置?如何实现可重置的Once?单例模式如何实现?
-
goroutine泄漏通常由channel未关闭或阻塞操作未退出导致。可以通过pprof查看goroutine数量,分析堆栈信息定位未退出的协程。常见原因包括无限循环、阻塞IO未取消等。相似问题及优化建议:如何优雅关闭goroutine?context如何防止泄漏?高并发如何控制协程数量?
-
Go语言的垃圾回收采用并发三色标记清除算法,实现低延迟GC。GC过程包括标记、清除两个阶段,通过三色标记法区分对象状态,并使用write barrier保证并发安全。Go从1.5版本后实现并发GC,大幅降低STW时间。相似问题及优化建议:如何降低GC频率?如何查看GC日志?如何减少内存分配提升性能?使用对象复用或sync.Pool。
-
json.Unmarshal到interface{}时数字默认float64。核心结论符合JSON规范需手动转换类型可使用Decoder自定义解析详细分析JSON标准未区分整数与浮点。Go统一解析为float64以保证兼容性。常见问题如何优化?定义具体结构体避免interface解析。
-
atomic基于CPU原子指令实现无锁更新。核心结论使用CAS指令避免上下文切换适用于简单状态更新详细分析atomic通过Compare-And-Swap保证操作不可分割。适合计数器等轻量场景。常见问题如何优化?复杂逻辑仍应使用互斥锁。
-
strings.Builder可减少内存分配次数。核心结论避免频繁创建新字符串底层维护可扩展缓冲区性能优于+拼接详细分析字符串不可变,每次拼接都会产生新对象。Builder通过复用缓冲区提升效率。常见问题如何优化?高频拼接场景使用Builder或bytes.Buffer。
-
GOMAXPROCS决定同时运行Go代码的最大CPU核心数。核心结论默认等于CPU核心数影响并行而非并发数量设置过低会限制性能详细分析GOMAXPROCS控制P的数量,从而决定多少goroutine可真正并行执行。合理设置可提升CPU密集型任务效率。常见问题如何优化?一般保持默认值,特殊场景可压测调整。