Verwenden von Konstruktoren zum Initialisieren von Strukturmitgliedern in Go
Das Initialisieren von Strukturmitgliedern kann eine Herausforderung sein, insbesondere für Anfänger. Sehen wir uns ein Problem an, bei dem das Erstellen einer neuen Strukturinstanz („sm“) und das Aufrufen einer Funktion darauf („sm.Put“) aufgrund eines Nullzeigers zu einer Panik führte.
Problem:
<br>import „sync“</p> <p>type SyncMap struct {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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, true
}
func main() {
sm := new(SyncMap) sm.Put("Test, "Test") // Panic
}
Dieser Code schlägt fehl, weil sowohl das lock- als auch das hm-Feld nicht initialisiert sind.
Workaround (nicht ideal):
Eine Workaround bestand darin, eine Init-Funktion hinzuzufügen und die Felder nach der Erstellung manuell zu initialisieren die Instanz:
<br>func (m *SyncMap) Init() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> m.hm = make(map[string]string) m.lock = new(sync.RWMutex)
}
Elegante Lösung: Verwendung eines Konstruktors
Ein besserer Ansatz ist die Verwendung eines Konstruktorfunktion zum Initialisieren der Struktur:
<br>func NewSyncMap() *SyncMap {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return &SyncMap{hm: make(map[string]string)}
}
Durch den Aufruf von NewSyncMap() können Sie eine neue Instanz mit initialisierten Mitgliedern erstellen.
Erweiterter Konstruktor:
Für komplexere Strukturen Konstruktoren kann andere Initialisierungsaufgaben ausführen, wie z. B. das Starten von Goroutinen oder das Registrieren von Finalizern:
<br>func NewSyncMap() *SyncMap {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm
}
Fazit:
Konstruktoren bieten eine elegante und flexible Möglichkeit, Strukturmitglieder zu initialisieren . Indem Sie sie nutzen, können Sie die Erstellung neuer Strukturinstanzen optimieren, Null-Zeiger-Panik vermeiden und den Initialisierungsprozess für komplexe Datenstrukturen vereinfachen.
Das obige ist der detaillierte Inhalt vonWie können Konstrukteure Nil-Pointer-Panics beim Initialisieren von Go-Strukturen lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!