Entwurfsmuster mit Singleton im Paket

WBOY
Freigeben: 2024-02-15 15:33:08
nach vorne
1136 Leute haben es durchsucht

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()
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage