-
defer会增加少量函数调用开销。核心结论存在入栈出栈成本Go1.14后优化明显普通场景影响极小详细分析旧版本defer性能较低,新版本采用内联优化。在高频循环中仍需谨慎使用。常见问题如何优化?避免在热点循环中频繁声明defer。
-
panic 会破坏正常的控制流。核心结论不可控影响可测试性不利于服务稳定详细分析panic 更适合不可恢复错误。业务错误应返回 error。常见问题什么时候可以 panic?程序无法继续时。
-
循环中频繁使用time.After可能导致内存泄漏。核心结论每次调用都会创建新的Timer未消费的Timer会堆积应使用time.NewTimer复用详细分析在高频循环中调用time.After增加GC压力,可能导致程序内存占用升高。典型错误是内存使用不断增长。常见问题如何优化?使用time.NewTimer并手动Stop与Reset。
-
panic用于不可恢复错误,需要在defer中用recover捕获。核心结论panic会中断调用栈recover需在defer中使用可防止程序崩溃详细分析业务逻辑不宜使用panic,库或系统异常可以使用panic+recover。滥用panic会影响程序稳定性。常见问题如何优化?在适当位置捕获panic并记录日志或清理资源后恢复。
-
错误的类型断言会触发interface conversion panic。核心结论类型断言前确认类型避免错误转换接口可用value, ok安全断言详细分析将interface{}转换成不兼容的类型会panic。典型发生于interface转struct或具体类型时。常见问题如何优化?使用v, ok := x.(T)安全断言。
-
new分配内存,make初始化引用类型。核心结论new返回指针make用于slice、map、channelmake会初始化内部结构详细分析new仅分配零值内存。make会为引用类型分配并初始化底层数据结构。常见问题如何优化?根据类型选择合适关键字,避免误用。
-
Go语言中GOMAXPROCS的作用是什么?GOMAXPROCS用于设置同时执行用户级Go代码的最大CPU核心数。默认值为机器CPU核心数。合理设置可以优化并发性能。
-
循环中频繁使用time.After可能造成内存泄漏。核心结论time.After返回只读channel未消费的Timer会堆积应使用time.NewTimer复用详细分析每次调用time.After都会创建新的Timer对象。在高频循环中易增加GC压力。常见问题如何优化?使用time.NewTimer并在循环中Stop和Reset。
-
Go语言中interface的底层结构是什么?Go接口在底层由两个指针组成:类型信息指针和数据指针。空接口与非空接口在底层结构略有不同。接口变量为nil必须同时满足类型指针和数据指针都为nil。
-
Go语言中slice扩容规则是什么?当append超出容量时,Go会重新分配底层数组。小于1024时通常按2倍扩容,大于1024后按约1.25倍增长。扩容会产生新数组并复制旧数据。
-
通过双返回值接收判断是否关闭。核心结论value, ok :=
-
使用http.Server的Shutdown方法。核心结论等待现有请求完成拒绝新连接配合context控制超时详细分析Shutdown会通知底层listener关闭。在超时时间内完成活跃连接处理。常见问题如何优化?监听系统信号触发优雅退出。
-
关闭channel后仍可读取已存在数据。核心结论可读取缓冲区剩余数据读取完后返回零值写入会触发panic详细分析关闭channel不会立即清空数据。通过value, ok :=
-
map在多个goroutine写入时会触发fatal error: concurrent map writes。核心结论map不是线程安全的需加锁保护可使用sync.Map替代详细分析并发写入会破坏底层哈希结构,导致panic。常见于多goroutine写map而未加锁的情况。常见问题如何优化?使用RWMutex或sync.Map保证并发安全。
-
通过固定数量goroutine处理任务队列。核心结论控制并发数量避免资源耗尽提升系统稳定性详细分析创建任务channel作为队列。启动固定数量worker循环消费。常见问题如何优化?结合context与WaitGroup管理生命周期。