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
Barbara StreisandOriginal
2024-12-01 06:39:09563Durchsuche

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>
<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>
<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>
<pre class="brush:php;toolbar:false">return &amp;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>
<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

}

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!

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