Wie vermeide ich Laufzeitfehler beim Zugriff auf eingebettete Felder in Go-Strukturen mit Zeigern?

DDD
Freigeben: 2024-10-30 04:23:02
Original
932 Leute haben es durchsucht

How to Avoid Runtime Errors When Accessing Embedded Fields in Go Structs with Pointers?

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

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

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

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

Dieser Code initialisiert erfolgreich die Cars-Instanz, weist eingebetteten Feldern Werte zu und gibt die erwartete Ausgabe aus:

&{0x10328100 {4}}
&{342} 342
{4} 4
Nach dem Login kopieren

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!

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!