Typaliase in Go verstehen
Typaliase in Go können verwirrend sein. Der folgende Code veranschaulicht dies:
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works !! fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
Warum erbt der direkte Alias durWithoutMethods im Gegensatz zu durWithMethods keine Methoden?
Typdeklarationen und Aliase
Um dies zu verstehen, müssen wir zwischen Typdeklarationen und Typaliasen unterscheiden. Eine Typdeklaration erstellt einen neuen Typ und entfernt alle Methoden vom zugrunde liegenden Typ. Ein Typalias hingegen bindet einfach einen neuen Bezeichner an einen vorhandenen Typ.
Methodenauflösung
Im Fall von durWithMethods ist ein neuer Typ durWithMethods erstellt mit dur als zugrunde liegendem Typ. Da du time.Duration einbettet, werden Methoden von time.Duration zu dur heraufgestuft. Daher kann d.String() mit der Abkürzung d.Duration.String() aufgerufen werden.
Methodenentfernung
In durWithoutMethods jedoch der direkte Alias von time.Duration werden alle Methoden entfernt. Da Duration.String() eine Methode von time.Duration ist, wird sie nicht von durWithoutMethods geerbt.
True-Type-Aliase
Ein True-Type-Alias hingegen Andererseits wird mit dem =-Zeichen gekennzeichnet:
type sameAsDuration = time.Duration
Dadurch wird ein Alias für erstellt time.Dauer ohne Stripping-Methoden. Daher kann sad.String() ähnlich wie d.String() aufgerufen werden.
Das obige ist der detaillierte Inhalt vonWarum erbt ein direkter Typ-Alias keine Methoden in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!