回首忆惘然
更新我最终使用package config来初始化数据库,在应用程序开始时,它非常好,因为您不必将任何不需要的参数传递给函数。原来的我仍然是 golang 世界的新手,但我正在处理同样的问题,方法是在主包中声明局部变量,在我的情况下是 package appvar mongoClient *mongo.Clientvar mongoCtx context.Contextvar mongoCancelCtx context.CancelFunc然后我将它们传递给内部的数据库文件package config以连接到数据库,并使用传递的指针来分配结果。# app/app.govar mongoClient *mongo.Clientvar mongoCtx context.Contextvar mongoCancelCtx context.CancelFuncconfig.BootstrapDatabase(&mongoClient, &mongoCtx, &mongoCancelCtx)# app/config/database.go// BootstrapDatabase ...func BootstrapDatabase(mongoClient **mongo.Client, ctx *context.Context, cancel *context.CancelFunc) { *ctx, *cancel = context.WithTimeout(context.Background(), 10*time.Second) client, err := mongo.Connect(*ctx, options.Client().ApplyURI(os.Getenv("MONGO_URI"))) if err != nil { panic(err) } if err := client.Ping(*ctx, readpref.Primary()); err != nil { panic(err) } *mongoClient = client fmt.Println("Successfully connected and pinged.")}然后我创建一个数据库引用并将它传递给将使用它的每个包。# app/app.godb := mongoClient.Database(os.Getenv("MONGO_DATABASE"))repositories.BootstrapRepositories(db)e := echo.New()routes.BootstrapRoutes(e, db)所以这个想法是app/app.go在我的应用程序中的高级包中声明数据库引用并根据需要传递它,例如在我的package routes#app/app.go// BootstrapRoutes ...func BootstrapRoutes(e *echo.Echo, db *mongo.Database) { // Set middleware e.Use(middleware.Logger()) e.Use(middleware.Recover()) // Users related routes e.POST("/api/users", controllers.CreateUser) // Starte web server e.Logger.Fatal(e.Start(":4242"))}我仍在试验它,我不知道这种方法是否适用于许多端点,或者我需要尝试将它分离到自己的包中,如本期第一个线程中所建议的那样。请分享您的想法,我很高兴收到您的来信。