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.
Définissez une interface exportée avec les méthodes souhaitées, telles que :
<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>
Utilisez l'instance singleton en vous référant à la variable d'interface exportée, par exemple. :
<code class="go">if err := dbprovider.Mgr.AddArticle(someArticle); err != nil { // Handle error }</code>
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>
Au lieu d'utiliser une fonction d'initialisation du package, vous pouvez également initialiser explicitement le singleton :
<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!