Mencipta singleton dengan kaedah dalam Go boleh dicapai dengan menggunakan jenis pelaksana yang tidak dieksport dan antara muka yang dieksport.
Tentukan antara muka yang dieksport dengan kaedah yang diingini, seperti:
<code class="go">package dbprovider type Manager interface { AddArticle(article *article.Article) error }</code>
Buat jenis yang tidak dieksport yang melaksanakan antara muka:
<code class="go">type manager struct { db *gorm.DB }</code>
Memulakan tika tunggal dalam fungsi permulaan pakej, yang dilaksanakan sekali sebelum sebarang rujukan pakej:
<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>
Gunakan tika tunggal dengan merujuk kepada pembolehubah antara muka yang dieksport, mis. :
<code class="go">if err := dbprovider.Mgr.AddArticle(someArticle); err != nil { // Handle error }</code>
Untuk menangkap dan mengembalikan pengecualian daripada 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>
Daripada menggunakan fungsi permulaan pakej, anda juga boleh memulakan singleton secara eksplisit:
<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>
Pendekatan ini membolehkan pengguna memutuskan sama ada untuk menggunakan contoh yang dikongsi atau mencipta yang baharu, cth. untuk tujuan ujian.
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Instance DB Singleton dengan Kaedah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!