标为推荐的数据库惰性初始化示例丢弃错误并禁止重试
原文依据:2 处示例在 sync.Once 内调用 sql.Open 时用下划线丢弃错误,随后无条件返回 db.conn。由于 Once 只执行一次,首次初始化失败后不会再次尝试。
如果代理把该示例用于实际数据库代码,配置、驱动或连接初始化错误可能被隐藏;调用方可能收到 nil 或不可用连接,导致后续失败或服务不可用,同时失去自动恢复机会。
这是教学示例而非自动执行代码,但若用户采纳,风险成立:sync.Once 使初始化体只运行一次,而 sql.Open 的错误被 `_` 丢弃,调用方也无法判断初始化是否成功或触发重试;失败时可能得到 nil/不可用连接并在后续操作中出错。用户可要求作者提供返回 `(*sql.DB, error)`、保存并检查初始化错误且明确重试策略的示例。
10. **Design useful zero values** — nil map fields panic on first write; use lazy init11. **Use `sync.Once` for lazy init** — guarantees exactly-once even under concurrency查看另外 1 个位置
func (db *DB) connection() *sql.DB { db.once.Do(func() { db.conn, _ = sql.Open("postgres", connStr) }) return db.conn}```