Heim >Backend-Entwicklung >Golang >Wie kann das Konstruktormuster Probleme bei der Initialisierung von Go-Strukturen lösen?
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.
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!