Когда я запускаю свой main.go со следующим кодом, он работает нормально, и клиент подключается к базе данных mongo.
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Trainer struct {
Name string
Age int
City string
}
func main() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Successful connection")
}
Однако, когда я пытаюсь разделить логику кода между init()
иmain()
goroutines, я получаю ошибку ссылки на память, что является нормальным, потому что main выполняется до того, как init фактически имеет соединение tcp с БД. Я попытался соединить их с каналом, но он не работает, как ожидалось.
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Trainer struct {
Name string
Age int
City string
}
var client *mongo.Client
var c = make(chan *mongo.Client)
func init() {
// configures the connection options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
c <- client
}
func main() {
fmt.Println(<-c)
}
Поскольку у меня недостаточно опыта работы с golang, кто-нибудь может объяснить мне, почему мое решение не работает и как я могу это исправить? Я хочу, чтобы init () и main () были разделены, если это возможно.