-
Go语言的select在多个case同时满足条件时采用伪随机算法选择执行分支,以避免饥饿问题。编译器会将case顺序打乱,通过runtime中的随机机制遍历case列表,保证公平性。这样可以防止固定顺序导致某些case长期得不到执行。相似问题及优化建议:select是否绝对公平?select如何避免阻塞?高并发场景如何设计select结构?避免case过多。
-
sync.Map适合读多写少的高并发场景。内部采用分段锁和只读副本结构优化读性能,不适合频繁写入场景。相似问题及优化建议:sync.Map和map+Mutex区别?什么时候不用sync.Map?如何优化高并发map?
-
sync.Pool用于缓存临时对象,减少频繁分配和回收带来的GC压力。对象放入Pool后可能在GC时被清空,因此适用于短生命周期对象缓存。适合高并发场景下减少内存分配次数,例如缓冲区复用。相似问题及优化建议:sync.Pool什么时候会被清空?sync.Pool适合长期对象缓存吗?如何正确使用对象池避免内存泄漏?
-
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解析。