-
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密集型任务效率。常见问题如何优化?一般保持默认值,特殊场景可压测调整。
-
逃逸到堆上的对象会增加GC压力。核心结论局部变量可能逃逸堆分配成本更高影响整体性能详细分析编译器通过静态分析决定变量分配位置。可使用go build -gcflags查看逃逸信息。常见问题如何优化?避免返回局部变量地址或接口转换导致逃逸。
-
Go语言中defer的执行顺序是如何保证的?Go中的defer采用栈结构(后进先出)。多个defer按照注册顺序入栈,在函数返回时按相反顺序执行。即最后声明的defer会最先执行,这种机制确保资源释放顺序可控。
-
访问未初始化指针或接口会触发nil pointer dereference。核心结论必须判空避免未初始化指针调用方法可使用防御式编程详细分析指针变量未指向实际对象时访问会触发运行时panic。常见于结构体指针未初始化或接口未赋值。常见问题如何优化?在使用前检查指针是否为nil,必要时初始化对象。
-
map遍历顺序在每次运行时都会随机化。核心结论防止依赖固定顺序提高安全性底层哈希结构决定详细分析Go在遍历map时会随机起始bucket。同一程序多次执行结果可能不同。常见问题如何优化?如需有序遍历,应先提取key并排序。
-
goroutine未退出会长期占用资源。核心结论阻塞在channel读写未监听context取消无限循环无退出条件详细分析泄漏的goroutine无法被GC回收。长期运行会导致内存与调度压力增加。常见问题如何优化?设计明确退出机制与超时控制。
-
未检查context Done可能导致goroutine阻塞。核心结论结合select监听context.Done避免无限等待及时退出goroutine详细分析HTTP请求、数据库或RPC操作未处理context取消,会导致阻塞和资源泄漏。典型错误是goroutine无法退出或请求长时间卡住。常见问题如何优化?在阻塞操作中加入select判断ctx.Done(),超时及时返回。
-
接口变量为nil必须类型和值都为nil。核心结论接口底层包含类型指针存储nil指针时接口可能不为nil容易产生隐藏bug详细分析当接口中保存的是(*Struct)(nil)时,类型信息存在。此时接口!=nil,但数据实际为空。常见问题如何优化?避免返回带具体类型的nil指针接口。
-
select在多个可用case中会进行伪随机选择。核心结论避免固定顺序导致饥饿提升并发公平性底层由runtime调度实现详细分析当多个channel同时就绪时,runtime会打乱case顺序。保证不会长期偏向某一个分支。常见问题如何优化?避免依赖select的执行顺序做业务判断。
-
Go语言中如何避免goroutine泄漏?goroutine泄漏通常因为阻塞在channel或未正确退出。建议使用context控制生命周期,确保所有goroutine都有退出路径。同时避免无限阻塞等待。
-
time.After在循环中可能产生内存泄漏。核心结论每次调用都会创建新Timer未消费会堆积建议使用time.NewTimer复用详细分析time.After返回一个只读channel。在高频循环中创建会增加GC压力。常见问题如何优化?使用Timer并手动Stop与Reset。
-
sync.Once通过原子变量和互斥锁保证只执行一次。核心结论先用atomic判断再加锁双重检查线程安全且高效详细分析第一次执行时加锁,后续调用直接返回。适合单例初始化。常见问题如何优化?避免在Once内部执行耗时操作。