Heim >Backend-Entwicklung >Golang >Entwurfsmuster mit Singleton im Paket

Entwurfsmuster mit Singleton im Paket

WBOY
WBOYnach vorne
2024-02-15 15:33:081151Durchsuche

Entwurfsmuster mit Singleton im Paket

PHP-Editor Apple ist hier, um Ihnen ein häufig verwendetes Designmuster vorzustellen – das Designmuster mit Singleton. In der Softwareentwicklung wird häufig das Singleton-Muster verwendet, das sicherstellt, dass eine Klasse nur eine Instanz hat und einen globalen Zugriffspunkt bereitstellt. Dieses Entwurfsmuster kann die Wiederverwendbarkeit und Leistung von Code verbessern und gleichzeitig einige potenzielle Probleme vermeiden. Bei der Verwendung dieses Entwurfsmusters müssen Sie auf Details wie Thread-Sicherheit und verzögertes Laden achten, um die Korrektheit und Zuverlässigkeit der Implementierung sicherzustellen.

Frageninhalt

Ich bin immer noch kein Golang-Experte und versuche, Best Practices zu verstehen und zu lernen

So initialisieren Sie einen Singleton in einem Paket und machen ihn threadsicher, sodass es auch dann nur eine Instanz gibt, wenn das Paket mehrmals in verschiedene Dateien importiert wird

Jetzt Instanz sessions 在 main 中启动,但随后我必须传递它。如何在 sess 包内启动实例 sessions und daraus eine globale Variable oder etwas anderes im Paket machen?

Ich möchte, dass es eine private Variable innerhalb des sessPakets

ist
package main

func main(){
    sessions := sess.Init()
}

sessModul

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
}

Lösung

Verwenden Sie einen Singleton, um exportierteVariablen auf Paketebene zu deklarieren und zu initialisieren. Es gibt eine Initialisierungsinstanz für jede Variable auf Paketebene und nicht eine Instanz oder Initialisierung für jeden Import.

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
}

Das obige ist der detaillierte Inhalt vonEntwurfsmuster mit Singleton im Paket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen