-
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管理生命周期。
-
读写锁允许多个读操作并发执行。核心结论读多写少场景性能更好写操作独占锁避免读锁阻塞详细分析RWMutex通过分离读写锁计数实现并发读。写锁会阻塞所有读写操作。常见问题如何优化?写频繁场景不一定比Mutex更优。
-
向已关闭的channel发送数据会触发panic。核心结论发送前需确保channel未关闭接收方可安全读取已关闭channel关闭操作必须唯一详细分析channel只能关闭一次,多次关闭或关闭后发送会panic。典型错误信息为send on closed channel。常见问题如何优化?明确关闭channel责任,只由发送方关闭,并使用标志变量控制。
-
panic用于不可恢复的严重错误。核心结论会中断调用栈影响程序稳定性业务错误应返回error详细分析panic更适合系统级异常。业务逻辑应通过error传递。常见问题如何优化?统一错误处理与日志记录机制。
-
WaitGroup计数不匹配会导致死锁。核心结论Add与Done必须成对Wait会阻塞直到计数为0计数负数会panic详细分析Add调用在goroutine启动前,Done在goroutine完成时调用。计数不匹配会导致主goroutine永远阻塞。常见问题如何优化?严格保证Add和Done成对,避免在goroutine内部调用Add。
-
访问slice超出边界会触发index out of range panic。核心结论检查索引是否在合法范围循环边界严格控制切片长度使用len函数判断详细分析超界访问会导致程序panic并终止。典型错误发生在动态生成slice或循环访问时。常见问题如何优化?访问前确保索引在0到len-1范围内,必要时先判断长度。
-
访问数组或slice超出索引范围会触发index out of range panic。核心结论检查索引合法性循环边界需严格控制切片长度可用len判断详细分析Go运行时会检测数组和slice的访问边界。超界访问会直接导致panic并终止程序。常见问题如何优化?在访问前确保索引在0到len-1范围内。