Heim >Backend-Entwicklung >Golang >Warum erbt ein Typalias Methoden von einem eingebetteten Typ, aber nicht von einem Rohtyp?
Den Einfluss von Typaliasen auf die Methodenvererbung verstehen
Typaliase, ein häufiger Aspekt von Programmiersprachen wie Go, bieten eine praktische Möglichkeit dazu Erstellen Sie neue Bezeichner für vorhandene Typen. Ihr Verhalten in Bezug auf die Methodenvererbung kann jedoch verwirrend sein.
Bedenken Sie den folgenden Go-Code:
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 }
Der Code deklariert drei Typen: dur, durWithMethods und durWithoutMethods. Typ dur ist eine Struktur, die time.Duration einbettet. Der Typ durWithMethods ist als Alias für dur definiert. Der Typ durWithoutMethods hingegen ist ein Alias für time.Duration.
Es stellt sich die Frage, warum durWithMethods die String()-Methode von time.Duration erbt, während durWithoutMethods dies nicht tut.
Typdeklarationen und Methodenvererbung
In Go, Typdeklarationen fallen in zwei Kategorien: Typdefinitionen und Typaliase.
In diesem Fall dur ist eine Typdefinition, während sowohl durWithMethods als auch durWithoutMethods Typaliase sind.
Auswirkungen auf die Methodenvererbung
Wenn ein neuer Typ mithilfe einer Typdefinition wie dur erstellt wird, wird er verliert alle geerbten Methoden. Das bedeutet, dass dur nicht von Natur aus über die String()-Methode von time.Duration verfügt. Wenn jedoch ein neuer Typ mit einem Typalias wie durWithMethods erstellt wird, erbt er alle Methoden des zugrunde liegenden Typs, in diesem Fall dur.
Time.Duration und Raw Types
time.Duration ist ein Rohtyp, das heißt, er kann keine Methoden haben. Es kann jedoch in eine Struktur wie dur eingebettet werden, wodurch die Struktur ihre Methoden erben kann.
Typalias vs. Direktalias
durWithoutMethods ist ein direkter Alias der Zeit.Dauer. Dieses Typentfernungsverhalten gilt nur für direkte Aliase und gilt nicht für Typaliase wie durWithMethods.
Zusammenfassend lässt sich sagen, dass durWithMethods die String()-Methode von time.Duration erbt, da es sich um einen Alias für einen Typ handelt, der Zeit einbettet .Duration, durWithoutMethods erbt diese Methode nicht, da es sich um einen direkten Alias eines Raw handelt Typ.
Das obige ist der detaillierte Inhalt vonWarum erbt ein Typalias Methoden von einem eingebetteten Typ, aber nicht von einem Rohtyp?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!