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
Linda HamiltonOriginal
2024-12-02 04:04:14734Durchsuche

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")
}

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")
}

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)}
}

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")
}

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
}

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!

Stellungnahme:
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