Heim >Backend-Entwicklung >Golang >Warum verhalten sich Typaliase in Go anders, wenn sie von eingebetteten Typen erben?
Eintauchen in Typ-Aliasing-Komplexitäten
Betrachten Sie den folgenden Codeausschnitt:
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 }
Man könnte darüber nachdenken, warum das direkt Alias von time.Duration (durWithoutMethods) erbt keine Methoden, während die verschachtelten Der Typalias (durWithMethods) gewährt Zugriff darauf. Diese Verwirrung rührt von einem grundlegenden Unterschied zwischen Typdefinitionen und Typaliasen her.
Neue Typen definieren oder bestehende umbenennen
In Go lassen sich Typdeklarationen in zwei Kategorien einteilen: Typdefinitionen und Typaliase. Typdefinitionen bringen neue Typen hervor, indem sie einen oder mehrere vorhandene Typen einbetten. Sie erben Methoden nur von den eingebetteten Typen der obersten Ebene, nicht von verschachtelten Typen.
Typaliase hingegen sind bloße Abkürzungen, die neue Bezeichner an vorhandene Typen binden. Sie erstellen keine neuen Typen, sodass der zugrunde liegende Typ unverändert bleibt. Alle mit dem zugrunde liegenden Typ verknüpften Methoden sind weiterhin über den ursprünglichen Namen oder den Alias leicht zugänglich.
DurWithMethods verstehen
Der Typ durWithMethods erweitert den Typ dur effektiv um es einbetten. Da dur time.Duration einbettet, erbt es die Methoden von Duration, einschließlich String(). Daher funktioniert d.String() im Code wie erwartet.
Enthüllung von durWithoutMethods
Im Gegensatz zu durWithMethods ist durWithoutMethods ein direkter Alias von time.Duration. Es erweitert nichts und besteht daher ausschließlich aus dem primitiven Typ time.Duration. Methoden von time.Duration werden nicht an durWithoutMethods übertragen, da es sich um einen eigenständigen Typ mit einem eigenen Methodensatz handelt. Daher wird dWM.String() nicht kompiliert.
Das obige ist der detaillierte Inhalt vonWarum verhalten sich Typaliase in Go anders, wenn sie von eingebetteten Typen erben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!