首頁 >後端開發 >Golang >包中帶有單例的設計模式

包中帶有單例的設計模式

WBOY
WBOY轉載
2024-02-15 15:33:081145瀏覽

包中帶有單例的設計模式

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除