Geschichte des Themas:
Das Erscheinen von Type Aliases in Go hängt mit der Notwendigkeit zusammen, einen sanfteren Übergang zwischen den API-Versionen zu gewährleisten, wenn ein Typ von einem Paket in ein anderes wechselt. Bis Go 1.9 wurden nur neue Typen deklariert, jetzt werden auch Type Aliases unterstützt.
Problem:
Viele verwechseln Aliases und neue Typen — betrachten sie fälschlicherweise als identisch, was zu Fehlern bei der Konvertierung, Methoden und der Übergabe an Interfaces führt.
Lösung:
Type Alias erstellt einen alternativen Namen für einen bestehenden Typ, während die Deklaration eines neuen Typs die Erstellung eines neuen, einzigartigen Typs auf Basis eines bestehenden ist. Aliases ermöglichen die Wahrung der Abwärtskompatibilität und die Integration alter und neuer Typen ohne Konvertierung.
Beispielcode:
// Neuer Typ type MyString string // Type Alias type MyStringAlias = string
Wichtige Merkmale:
Kann man Methoden einem Typ über einen Alias hinzufügen?
Nein, Methoden können nur neuen Typen hinzugefügt werden, ein Alias ist kein neuer Typ, sondern das Gleiche wie der ursprüngliche Typ.
type Alias = int // func (a Alias) Method() {} // Fehler!
Was ist der Unterschied zwischen einem Alias und einem neuen Typ im Vergleich?
Ein Alias ist mit dem Basistyp vergleichbar und nimmt dessen Wert ohne Konvertierung an. Ein neuer Typ ist nicht kompatibel, selbst wenn er auf demselben Typ basiert.
type T1 = int var a T1 = 10 // ok var b int = a // ok type T2 int var c T2 = 10 // var d int = c // Kompilierungsfehler
Wann ist ein Alias besser als ein neuer Typ?
Wenn ein Re-Export des Typs zwischen Paketen erforderlich ist oder eine transparente Migration der API ohne Neukompilierung des Client-Codes sichergestellt werden muss. Zum Beispiel:
type OldType = NewType // Alias ist einfacher für die Unterstützung alter API-Versionen
Im Projekt wird der Typ mit einem neuen Typ umbenannt und nicht mit einem Alias, was die Kompatibilität bricht.
type OldType int
Vorteile:
Nachteile:
Ein Type Alias wird für eine transparente Migration der API verwendet.
type OldType = NewType
Vorteile:
Nachteile: