php小編蘋果在這裡為大家介紹一個常用的設計模式-帶有單一範例的設計模式。在軟體開發中,單例模式被廣泛應用,它可以確保一個類別只有一個實例,並提供一個全域存取點。這種設計模式可以提高程式碼的複用性和效能,同時也能夠避免一些潛在的問題。在使用這種設計模式時,需要注意線程安全性和懶加載等細節問題,以確保實現的正確性和可靠性。
我仍然不是 golang 專家,並嘗試理解和學習最佳實踐
如何在套件中初始化單例並使其線程安全,這樣即使在不同檔案中多次導入包,也只會有一個實例
現在實例 sessions
在 main 中啟動,但隨後我必須傳遞它。如何在 sess
套件內啟動實例 sessions
,使其成為全域變數或套件內的其他內容?
我希望它是 sess
套件內的私有變數
package main func main(){ sessions := sess.Init() }
sess
模組
package sess import ( "sync" "time" ) type pool struct { lock sync.RWMutex sessions map[string]*session } func Init() *pool { p := &pool{ sessions: map[string]*session{}, } return p } func (p *pool) Set(sid string, s *session){ p.lock.Lock() defer p.lock.Unlock() p.sessions[sid] = s } func (p *pool) Get(sid string) (*session, bool){ p.lock.RLock() defer p.lock.RUnlock() s, ok := p.sessions[sid] return s, ok }
使用單例宣告並初始化導出的套件級變數。每個包級變數都有一個初始化實例,而不是每次導入都有一個實例或初始化。
package sess import ( "sync" "time" ) type pool struct { lock sync.RWMutex sessions map[string]*session } var Pool = &pool{sessions: map[string]*session{}} func (p *pool) Set(sid string, s *session){ p.lock.Lock() defer p.lock.Unlock() p.sessions[sid] = s } func (p *pool) Get(sid string) (*session, bool){ p.lock.RLock() defer p.lock.RUnlock() s, ok := p.sessions[sid] return s, ok }
以上是包中帶有單例的設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!