Go でメソッドを備えたシングルトンを作成するには、エクスポートされていない実装型とエクスポートされたインターフェイスを利用します。
必要なメソッドを使用してエクスポートされたインターフェイスを定義します。
<code class="go">package dbprovider type Manager interface { AddArticle(article *article.Article) error }</code>
インターフェイスを実装するエクスポートされていない型を作成します:
<code class="go">type manager struct { db *gorm.DB }</code>
パッケージ初期化関数でシングルトン インスタンスを初期化します。これは、パッケージ参照の前に 1 回実行されます。
<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>
エクスポートされたインターフェイス変数を参照して、シングルトン インスタンスを使用します。 :
<code class="go">if err := dbprovider.Mgr.AddArticle(someArticle); err != nil { // Handle error }</code>
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>
パッケージ初期化関数を使用する代わりに、シングルトンを明示的に初期化することもできます。
<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>
このアプローチにより、ユーザーは共有インスタンスを使用するか新しいインスタンスを作成するかを決定できます。例えばテスト目的のため。
以上がGo のメソッドを使用してシングルトン DB インスタンスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。