Einfache Antwort: Übergeben Sie einen initialisierten Verbindungspool an die eigenen Globals Ihrer Pakete.
z.B.
// package stuff
var DB *sql.DB
func GetAllStuff() (*Stuff, error) {
err := DB.Query("...")
// etc.
}
// package things
var DB *sql.DB
func GetAllThings() (*Thing, error) {
err := DB.Query("...")
// etc.
}
// package main
func main() {
db, err := sql.Open("...")
if err != nil {
log.Fatal(err)
}
stuff.DB = db
things.DB = db
// etc.
}
Wir definieren Paketebene Globals, stellen Sie sicher, dass sie exportiert (aktiviert) und dann einen Zeiger auf unsere Verbindungspool an sie weitergeben.
Dies ist "okay", aber kann "wo" Dinge verwendet werden maskieren. Wenn Sie einen Handler betrachten, ist es möglicherweise nicht klar wo die Verbindung herkommt, besonders wenn Ihr Paket wächst. Ein skalierbarer Ansatz könnte wie folgt aussehen:
// package stuff
type DB struct {
*sql.DB
}
func New(db *sql.DB) (*DB, error) {
// Configure any package-level settings
return &DB{db}, nil
}
func (db *DB) GetAllStuff() (*Stuff, error) {
err := db.Query("...")
// etc.
}
// package things
type DB struct {
*sql.DB
}
func New(db *sql.DB) (*DB, error) {
// Configure any package-level settings
return &DB{db}, nil
}
func (db *DB) GetAllThings() (*Thing, error) {
err := db.Query("...")
// etc.
}
// package main
func main() {
db, err := sql.Open("...")
if err != nil {
log.Fatal(err)
}
stuffDB, err := stuff.New(db)
if err != nil {
log.Fatal(err)
}
thingsDB, err := things.New(db)
if err != nil {
log.Fatal(err)
}
// Simplified.
http.HandleFunc("/stuff/all", stuff.ShowStuffHandler(stuffDB))
http.HandleFunc("/things/all", things.ShowThingsHandler(thingsDB))
// etc.
}
func ShowStuffHandler(db *stuff.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// We can use our stuff.DB here
stuff, err := db.GetAllStuff()
// etc.
}
}
Wenn Sie mehr als nur die DB-Verbindung als Abhängigkeit (zB Konfigurationsparameter erstellt, Host-Namen, etc.), wickeln Sie sie in einer things.Env
Struktur oder eine stuff.Env
struct für jedes Paket.
Ein Beispiel wäre eine things.New("deps...") *Env
Funktion, die eine konfigurierte *things.Env
zurückgibt, die die Abhängigkeiten enthält, die von Ihrem things
-Paket verwendet werden.
von "Paketen" verschiedene Projekte/Bibliotheken bedeuten? – ZAky
Nein, nur interne Pakete. – user1952811