Heim > Backend-Entwicklung > Golang > Wie kann das Konstruktormuster Probleme bei der Initialisierung von Go-Strukturen lösen?

Wie kann das Konstruktormuster Probleme bei der Initialisierung von Go-Strukturen lösen?

Linda Hamilton
Freigeben: 2024-12-02 04:04:14
Original
741 Leute haben es durchsucht

How Can the Constructor Pattern Solve Go Struct Initialization Problems?

Konstruktormuster zum Initialisieren von Go-Strukturen

Das Zuweisen und Initialisieren von Go-Strukturen kann für Neulinge schwierig sein. Betrachten Sie dieses Beispiel:

import "sync"

type SyncMap struct {
    lock *sync.RWMutex
    hm  map[string]string
}

func (m *SyncMap) Put(k, v string) {
    m.lock.Lock()
    defer m.lock.Unlock()

    m.hm[k] = v
}

func main() {
    sm := new(SyncMap)
    sm.Put("Test", "Test")
}
Nach dem Login kopieren

Dieser Code wird mit einer Nullzeiger-Ausnahme in Panik geraten, da lock und hm nicht initialisiert sind.

Um dieses Problem zu beheben, kann die folgende Problemumgehung verwendet werden:

func (m *SyncMap) Init() {
    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)
}

func main() {
    sm := new(SyncMap)
    sm.Init()
    sm.Put("Test", "Test")
}
Nach dem Login kopieren

Aber das fügt unnötige Boilerplate hinzu.

Der Konstruktor Muster

Ein saubererer Ansatz besteht darin, eine Konstruktorfunktion zum Initialisieren der Struktur zu verwenden. Ein Konstruktor ist eine Funktion, die eine initialisierte Instanz einer Struktur zurückgibt. Zum Beispiel:

func NewSyncMap() *SyncMap {
    return &SyncMap{hm: make(map[string]string)}
}
Nach dem Login kopieren

Dieser Konstruktor initialisiert das hm-Feld und gibt einen Zeiger auf die neu erstellte SyncMap-Instanz zurück.

func main() {
    sm := NewSyncMap()
    sm.Put("Test", "Test")
}
Nach dem Login kopieren

Jetzt initialisiert der Code die Struktur korrekt ohne Boilerplate .

Das Konstruktormuster kann auch verwendet werden, um mehrere Felder zu initialisieren, Goroutinen zu starten oder Finalizer für zu registrieren Struktur. Zum Beispiel:

func NewSyncMap() *SyncMap {
    sm := SyncMap{
        hm:  make(map[string]string),
        foo: "Bar",
    }

    runtime.SetFinalizer(sm, (*SyncMap).stop)

    go sm.backend()

    return &sm
}
Nach dem Login kopieren

Dieser Konstruktor initialisiert sowohl hm- als auch foo-Felder, startet eine Goroutine für backend() und registriert einen Finalizer, um die stop()-Methode auszuführen, wenn die SyncMap-Instanz durch Garbage Collection erfasst wird.

Das obige ist der detaillierte Inhalt vonWie kann das Konstruktormuster Probleme bei der Initialisierung von Go-Strukturen lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage