Heim > Artikel > Backend-Entwicklung > Wie greife ich in Go auf Subtypeigenschaften im übergeordneten Typobjekt zu?
In der Go-Sprache stoßen wir häufig auf Situationen, in denen wir auf Untertypeigenschaften in übergeordneten Typobjekten zugreifen müssen. Dies kann daran liegen, dass wir beim Definieren der Struktur verschachtelte Strukturen verwenden. Da es in der Go-Sprache jedoch kein Vererbungskonzept gibt, kann auf Subtypeigenschaften nicht direkt über das übergeordnete Typobjekt zugegriffen werden. Wie kann diese Anforderung in Go umgesetzt werden? Im Folgenden stelle ich Ihnen einige häufig verwendete Methoden vor.
Ich erstelle einen Dateispeicher. Ich versuche, verschiedene Dateitypen zu erstellen. Um dies zu simulieren, verwende ich den Code:
<code>package main import ( "fmt" "time" ) type File interface{} type Audio struct { File Duration time.Duration } type Image struct { File Width uint Height uint } func main() { var files = map[string]File{ "1": Audio{ Duration: 14 * time.Second, }, "2": Image{ Height: 9989, Width: 1111, }, "3": Image{ Width: 1234, Height: 5678, }, } for k, v := range files { switch v.(type) { case Audio: fmt.Printf("%s: Audio %d seconds", k, v.Duration / time.Second) case Image: fmt.Printf("%s: Image %dx%d", k, v.Width, v.Height) } } } </code>
Ich erwarte diese Ausgabe:
1: Audio 14 seconds 2: Image 1111x9989 3: Image 1234x5678
Aber der Go-Compiler hat mir diesen Fehler angezeigt:
./main.go:38:44: v.Duration ist undefiniert (Typ Datei hat kein Feld oder Methode Duration)
./main.go:40:39: v.Width undefiniert (Typ Datei hat kein Feld oder Methodenbreite)
./main.go:40:48: v.Height ist undefiniert (Typ Datei hat kein Feld oder Methode Height)
Wie kann der Fehler behoben werden?
switch v := v.(type) {
wird ein neues v
mit dem von Ihnen erwarteten Typ deklarieren.
Das obige ist der detaillierte Inhalt vonWie greife ich in Go auf Subtypeigenschaften im übergeordneten Typobjekt zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!