Zugriff auf eingebettete Felder in Strukturtypen
In Go können Strukturen andere Strukturen als Felder einbetten. Dies ermöglicht den Aufbau komplexer Datenstrukturen. Der Zugriff auf eingebettete Feldwerte kann jedoch verwirrend sein, wenn Zeiger verwendet werden.
Beispiel und Problem
Beachten Sie die folgenden Strukturdefinitionen:
<code class="go">type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine Tires } </code>
In In der Cars-Struktur wird ein eingebetteter Zeiger auf die Engine-Struktur (*Engine) definiert. Wenn eine Instanz von Cars wie gezeigt erstellt wird:
<code class="go">func main() { car := new(Cars) car.number = 4 car.power = 342 fmt.Println(car) } </code>
Das Programm gerät mit der folgenden Fehlermeldung in Panik:
panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x23bb]
Lösung
An Um auf einen eingebetteten Feldwert zuzugreifen, ist entweder ein expliziter Feldname oder eine Indirektion über den eingebetteten Zeiger erforderlich. Hier ist ein Beispiel für den Zugriff auf das Leistungsfeld durch Indirektion:
<code class="go">package main import "fmt" type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine Tires } func main() { car := new(Cars) car.Engine = new(Engine) car.power = 342 car.number = 4 fmt.Println(car) fmt.Println(car.Engine, car.power) fmt.Println(car.Tires, car.number) }</code>
Dieser Code initialisiert erfolgreich die Cars-Instanz, weist eingebetteten Feldern Werte zu und gibt die erwartete Ausgabe aus:
&{0x10328100 {4}} &{342} 342 {4} 4
Das obige ist der detaillierte Inhalt vonWie vermeide ich Laufzeitfehler beim Zugriff auf eingebettete Felder in Go-Strukturen mit Zeigern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!