Maison  >  Article  >  développement back-end  >  Comment créer une instance de base de données Singleton avec des méthodes en Go ?

Comment créer une instance de base de données Singleton avec des méthodes en Go ?

DDD
DDDoriginal
2024-11-01 11:43:29313parcourir

How to Create a Singleton DB Instance with Methods in Go?

Instance de base de données Singleton avec méthodes

La création d'un singleton avec des méthodes dans Go peut être réalisée en utilisant un type d'implémentation non exporté et une interface exportée.

Utilisation d'une interface et initialisation d'un package

Définir une interface exportée avec les méthodes souhaitées, telles que as :

<code class="go">package dbprovider

type Manager interface {
    AddArticle(article *article.Article) error
}</code>

Créez un type non exporté qui implémente l'interface :

<code class="go">type manager struct {
    db *gorm.DB
}</code>

Initialisez l'instance singleton dans une fonction d'initialisation de package, qui s'exécute une fois avant toute référence de package :

<code class="go">var Mgr Manager

func init() {
    db, err := gorm.Open("sqlite3", "../articles.db")
    if err != nil {
        log.Fatal("Failed to init db:", err)
    }
    Mgr = &manager{db: db}
}</code>

Utiliser le Singleton

Utiliser l'instance singleton en vous référant à l'interface exportée variable, par exemple :

<code class="go">if err := dbprovider.Mgr.AddArticle(someArticle); err != nil {
    // Handle error
}</code>

Gestion des exceptions dans gorm.Create(..)

Pour intercepter et renvoyer les exceptions de gorm.Create(..):

<code class="go">func (mgr *manager) AddArticle(article *article.Article) (err error) {
    mgr.db.Create(article)
    if errs := mgr.db.GetErrors(); len(errs) > 0 {
        err = errs[0]
    }
    return
}</code>

Approches alternatives

Au lieu d'utiliser une fonction d'initialisation du package, vous pouvez également initialiser le singleton explicitement :

<code class="go">var mgr = newManager()

func newManager() Manager {
    db, err := gorm.Open("sqlite3", "../articles.db")
    if err != nil {
        log.Fatal("Failed to init db:", err)
    }
    return &manager{db: db}
}</code>

Cette approche permet aux utilisateurs de décider d'utiliser l'instance partagée ou d'en créer une nouvelle, par ex. à des fins de test.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn