Go面试题更新 2026-08-05

在 Go 语言里,sync.Once 类型的主要用途是什么?请说明其底层实现原理和适用场景。

技术原理方案权衡Go

考察说明

考查对 Go 标准库并发原语 sync.Once 的理解,包括其功能、实现机制和正确的使用方式。

回答思路

  1. 【回答框架 1】sync.Once 是 Go 标准库提供的并发安全同步原语,用于确保某个函数在整个程序生命周期内只执行一次,即使有多个 goroutine 并发调用也不会重复执行。
  2. 【回答框架 2】其核心实现基于互斥锁和原子操作:内部包含一个标志位(done)和一个互斥锁(m)。首次调用时锁定互斥锁,检查标志位,若未执行则执行函数并置标志位为 1;后续调用通过原子读检查标志位,为 1 则直接返回。
  3. 【回答框架 3】使用方式通常为:声明一个 sync.Once 类型的变量,在需要执行的地方调用其 Do 方法,传入只执行一次的函数。典型场景包括单例模式初始化、全局配置加载、资源池创建等。
  4. 【回答框架 4】注意 sync.Once 只能保证传入 Do 的函数执行一次,如果该函数内部发生 panic,会被视为已执行,后续调用不会重试;且 Do 方法中的函数不能递归调用自身,否则会造成死锁。
  5. 【回答框架 5】对于需要确保多次操作不同资源的场景,应使用多个 sync.Once 实例,而不是复用同一个实例。
  6. 【关键点 1】sync.Once 确保函数只执行一次,通过互斥锁和原子操作实现。
  7. 【关键点 2】Do 方法传入的函数即使 panic 也不会重试。
  8. 【关键点 3】适合单例、配置加载等一次性初始化场景。
  9. 【易错点 1】Do 方法中的函数 panic 后不会再执行,盲目依赖其恢复机制可能导致初始化不完整。
  10. 【易错点 2】在 Do 内部递归调用同名 Once 实例会导致死锁。