这种数据访问模式是线程安全的吗?

Is this data access pattern thread-safe?

我实现了 dao.go 文件,实现如下:

并且为所有处理程序提供服务的 main.go 文件像这样使用它:

var dbClient *DbClient

func main() {
    db, err := GetDBClient()
    if err != nil {
        panic(err)
    }
    dbClient = db
    defer dbClient.Close()
    ...
}

因此 main.go 的所有处理程序都使用全局 dbClient
这种架构线程安全吗?它是否提供数据库操作的原子性?

这个设计应该不错

sql.DB 处理并发访问并实现池化。 gorm 从中继承了这些特性。

不过我会做一个改变。全局变量很难管理。 您可以将 db 注入到使用它的代码中。

// to be removed
// var dbClient *DbClient

func main() {
    db, err := GetDBClient()
    if err != nil {
        panic(err)
    }
    defer db.Close()

    CodeThatUsesDB(db)
    ...
}