Прежде всего, в вашем дизайне должно быть что-то не так, если вы хотите переместить объект, содержащий мьютекс.
Но если вы все равно решите это сделать, вам нужно создать новый мьютекс в конструкторе перемещения, например:
// movable
struct B{};
class A {
B b;
std::mutex m;
public:
A(A&& a)
: b(std::move(a.b))
// m is default-initialized.
{
}
};
Это поточно-безопасное, потому что движение конструктор может с уверенностью предположить, что его аргумент нигде не используется, поэтому блокировка аргумента не требуется.
Ваш код, возможно, код теста / POC. В производственном проекте вы можете использовать MVC или любую другую архитектуру в соответствии с вашими потребностями. Было бы сложно точно определить структуру вашего проекта. Но, по крайней мере, вы хотели бы создать пакет БД, который объявляет интерфейс для всех взаимодействий, связанных с БД. например,
type UserDBRepo interface{
AddUser(context.Context, *User)
GetUser(context.Context, uint64)
}
type userDBRepo struct{ //implements UserDBRepo
*sql.DB // or whatever type gorm.Open returns
}
func NewUserDBRepo(db *sql.DB) DBRepo{
return &dbRepo{DB: db}
}
Вышеуказанное в основном представляет собой одну таблицу RDBMS для этого примера. Для n
таблиц БД может быть n
таких файлов. Теперь вызовите NewUserDBRepo
из main.go и передайте этот экземпляр всем службам, которым требуется эта БД.