Heim >Backend-Entwicklung >Golang >Wie vermeide ich Laufzeitfehler beim Zugriff auf eingebettete Felder in Go-Strukturen mit Zeigern?

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

DDD
DDDOriginal
2024-10-30 04:23:02993Durchsuche

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>

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!

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