Heim > Backend-Entwicklung > Golang > Wie können Konstrukteure Nil-Pointer-Panics beim Initialisieren von Go-Strukturen lösen?

Wie können Konstrukteure Nil-Pointer-Panics beim Initialisieren von Go-Strukturen lösen?

Barbara Streisand
Freigeben: 2024-12-01 06:39:09
Original
562 Leute haben es durchsucht

How Can Constructors Solve Nil Pointer Panics When Initializing Go Structs?

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

}
func (m *SyncMap) Put (k, v string) {

    m.lock.Lock()
    defer m.lock.Unlock()

    m.hm[k] = v, true
Nach dem Login kopieren

}

func main() {

    sm := new(SyncMap)
    sm.Put("Test, "Test") // Panic
Nach dem Login kopieren

}

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

}

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 &amp;SyncMap{hm: make(map[string]string)}
Nach dem Login kopieren

}

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 &amp;sm
Nach dem Login kopieren

}

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!

Vorheriger Artikel:Wie kann ich mehrere GOPATH-Verzeichnisse in Go effektiv verwalten? Nächster Artikel:Wie kann ich unter Linux und macOS ein Programm erstellen, das ein Terminal (TTY) nachahmt?
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
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage