In der Programmiersprache Go kann der Entwickler eigene Typen auf Basis vorhandener Typen erstellen oder Aliasnamen zur Verbesserung der Lesbarkeit des Codes und zur Integration mit externen Bibliotheken deklarieren.
Historie:
Go vereinfacht das Typsystem grundsätzlich, indem es die Konzepte der Erstellung eines neuen Typs (type MyInt int) und eines Alias (type MyIntAlias = int) trennt. Häufig entsteht Verwirrung zwischen ihnen, was die Datenkompatibilität zwischen verschiedenen Teilen des Systems beeinflusst.
Problem:
Wenn der Typ nicht korrekt deklariert wird, können zahlreiche implizite Fehler auftreten: Unfähigkeit, Daten zwischen Paketen zu übertragen, falsches Verhalten mit externen Bibliotheken oder der Verlust aller Methoden beim Versuch, den Alias zu verwenden.
Lösung:
Beispielfrage:
package main import "fmt" type MyInt int // neuer Typ func (m MyInt) Double() int { return int(m) * 2 } type MyIntAlias = int // Typalias func main() { var a MyInt = 5 var b MyIntAlias = 10 fmt.Println(a.Double()) // funktioniert //fmt.Println(b.Double()) // Fehler: Methode nicht für int definiert }
Wesentliche Merkmale:
Kann man einen Alias für eine Struktur erstellen und ihm Methoden hinzufügen, die sich vom Basisstrukturtyp unterscheiden?
Nein. Methoden können nur für den neuen Typ deklariert werden, nicht für den Alias. Der Alias ist einfach ein anderer Name für denselben Typ, und kein Teil des Programms weiß von der "Erweiterung" des Typs.
type MyStructAlias = SomeStruct // func (s MyStructAlias) NewMethod() {} // Fehler
Können die Methoden des Basistyps automatisch an den Alias "angeklebt" werden?
Ja, denn es handelt sich um denselben Typ für den Compiler. Aber mit neuen Methoden kann nicht gearbeitet werden: Sie können dem Alias keine einzigartigen Methoden hinzufügen.
type MyString = string // alle Methoden und Funktionen für string funktionieren
Was ist der Unterschied zwischen Typumwandlung und Aliasumwandlung?
Bei der Deklaration eines neuen Typs ist eine explizite Umwandlung erforderlich: MyInt(x), wobei x — int. Für den Alias ist keine Umwandlung erforderlich — die Typen sind vollständig austauschbar.
type A int type B = int var x int = 3 var a A = A(x) // explizite Umwandlung var b B = x // implizit, dasselbe wie int
Ein Entwickler erstellt einen Alias für einen Typ einer externen Bibliothek in der falschen Annahme, dass man diesem Typ eigene Methoden hinzufügen und die Logik der Übergänge kapseln kann.
Vorteile:
Nachteile:
Ein Team erstellt einen neuen Typ auf Basis von int, um Benutzeridentifikatoren darzustellen, um die Geschäftslogik vor versehentlichem Verwechseln mit anderen ganzzahligen Werten zu schützen, und fügt spezielle Methoden (Validatoren, Konverter) hinzu.
Vorteile:
Nachteile: