Beispiele für Golang-Generika

Beispiele Fur Golang Generika



Die generische Funktion von Golang ermöglicht die Erstellung eines wiederverwendbaren Codes, der typsicher und mit einer Vielzahl von Typen kompatibel ist. Glücklicherweise eröffnet die Hinzufügung von Generika zu Go neue Möglichkeiten für die Wiederverwendung und Flexibilität von Code. Die neueste Version von Golang bringt die mit Spannung erwartete Unterstützung für Generika mit sich.

Noch wichtiger ist, dass Generics die starke Typsicherheit von Go aufrechterhalten, die eine statische Typprüfung zur Kompilierungszeit ermöglicht und die Typkorrektheit gewährleistet. Sie bieten eine standardisierte Fehlerbehandlung innerhalb generischen Codes, was die Übersichtlichkeit und Wartbarkeit verbessert. Darüber hinaus bieten sie eine standardisierte Fehlerbehandlung innerhalb des generischen Codes, was die Übersichtlichkeit und Wartbarkeit verbessert. In diesem Beitrag untersuchen wir die verschiedenen realen Go-Generika-Anwendungen und -Beispiele.

Beispiel 1: Verwendung der generischen Golang-Funktion

Einer der Hauptanwendungsfälle für Generika ist die Erstellung von Funktionen, die mit unterschiedlichen Typen arbeiten können. Hier gehen wir zu einem der Beispiele, in denen die generische Umfangsfunktion verwendet wird.







Paket hauptsächlich
importieren „fmt“
Funktion Umfang [ R int | float32 ]( Radius r ) {
C := 3 * 2 * Radius
fmt . Druckenln ( „Der generische Umfang ist:“ , C )
}
Funktion hauptsächlich () {
War r1 int = 7
War r2 float32 = 7 . 5
Umfang ( r1 )
Umfang ( r2 )
}

Am Anfang des vorherigen Codes importiert die Zeile das „fmt“-Paket, das Funktionen für formatierte E/A bereitstellt, einschließlich des Druckens der Ausgabe auf der Konsole. Dann definieren wir eine generische Funktion namens „circumference“, die einen Parameterradius eines generischen Typs „r“ annimmt, der entweder „int“ oder „float32“ sein kann. Innerhalb der Funktion berechnet sie den Umfang, indem sie den Radius mit dem konstanten Wert „3“ multipliziert und ihn dann mit „2“ multipliziert. Abschließend druckt es den berechneten Umfang mit „fmt.Println“.



Als nächstes haben wir die Hauptfunktion, in der zwei Variablen, r1 und r2, deklariert und mit den Werten 7 bzw. 7,5 zugewiesen werden. Danach wird die Funktion „Umfang“ zweimal aufgerufen und dabei r1 und r2 als Argumente übergeben.



Die Ausgabe zeigt die Berechnung durch Drucken der Umfänge der Kreise wie folgt an:





Beispiel 2:  Verwendung der generischen Golang-Schnittstelle

Darüber hinaus unterstützen uns Golang-Generika mit ihren Schnittstellen. Schnittstellen in Go sind ein wichtiges Werkzeug, um die Wiederverwendung und Polymorphie von Code zu erleichtern. Indem sie ihnen ermöglichen, mit vielen Typen zu funktionieren, erhöhen Generika die Leistungsfähigkeit von Schnittstellen. Das Folgende ist der Quellcode der Golang-Generika-Schnittstelle:



Paket hauptsächlich
importieren „fmt“
Typ EmpAge Schnittstelle {
int64 | int32 | float32 | float64
}
Funktion newGenericFunc [ Alter Alter ]( emp_Age Alter ) {
val := int ( emp_Age ) + 1
fmt . Druckenln ( val )
}
Funktion hauptsächlich () {
fmt . Druckenln ( „Alter der Arbeitnehmer“ )
War Alter1 int64 = 24
War Alter2 float64 = 25 . 5
newGenericFunc ( Alter1 )
newGenericFunc ( Alter2 )
}

Im vorherigen Quellcode haben wir eine Schnittstelle namens „EmpAge“ definiert, die die möglichen Typen für das Alter eines Mitarbeiters angibt. Die Schnittstelle umfasst die Typen int64, int32, float32 und float64. Diese Schnittstelle ermöglicht es der „generischen“ Funktion, jeden dieser Typen als Argument zu akzeptieren. Danach verwenden wir eine generische Funktion namens newGenericFunc, die den emp_Age-Parameter eines generischen Alterstyps übernimmt, der jeder Typ sein kann, der die EmpAge-Schnittstelle erfüllt. Innerhalb der Funktion wird emp_Age in ein int konvertiert und wie gezeigt um 1 erhöht.

Als nächstes deklarieren wir die beiden Variablen Age1 und Age2 und weisen in der Hauptfunktion die Werte 24 bzw. 25,5 zu. Danach werden Age1 und Age2 als Parameter an die Funktion newGenericFunc übergeben, die zweimal ausgeführt wird. Dabei werden die Altersangaben um 1 erhöht und die aktualisierten Werte generiert.

Die im Folgenden ausgegebene Ausgabe ist das Alter der generischen Funktion, die die Schnittstelle nutzt:

Beispiel 3: Verwendung der generischen Golang-Datenstruktur

Darüber hinaus bieten uns Go-Generika auch die Möglichkeit, generische Datenstrukturen wie Stapel, Warteschlangen und verknüpfte Listen zu erstellen. Betrachten Sie die Implementierung des generischen Stacks im Folgenden:

importieren „fmt“
Typ Stapel [ Keine ] [] T
Funktion ( st * Stapel [ T ]) Drücken ( Artikel T ) {
st = anhängen ( * st , Artikel )
}
Funktion ( st * Stapel [ T ]) Pop () T {
Wenn nur ( * st ) == 0 {
Panik ( „Nichts im Stapel“ )
}
Index := nur ( * st ) - 1
Artikel := ( * st )[ Index ]
* st = ( * st )[: Index ]
zurückkehren Artikel
}
Funktion hauptsächlich () {
Stapel := neu ( Stapel [ int ])
Stapel . Drücken ( 1 )
Stapel . Drücken ( 2 )
Stapel . Drücken ( 3 )
fmt . Druckenln ( Stapel . Pop ())
fmt . Druckenln ( Stapel . Pop ())
fmt . Druckenln ( Stapel . Pop ())
}

Im vorherigen Code wurde ein generischer Typ mit dem Namen „Stack“ definiert, der den Stack darstellt. Der „T“-Platzhalter ermöglicht es dem Stapel, Elemente jeglichen Typs aufzunehmen. Der Typ „Stack“ wird als Slice von Elementen vom Typ „T“ implementiert. Dabei kommen für den Typ „Stack“ zwei Funktionen zum Einsatz: „Push“ und „Pop“. Die Funktion Push() ist für das Hinzufügen der Elemente zum Stapel verantwortlich. Es nimmt ein Argumentelement vom Typ „T“ und hängt es mithilfe der Funktion append() an das zugrunde liegende Slice an.

Während die Funktion Pop() die Anfangskomponente vom Stapel nimmt und zurückgibt, bestimmt sie zunächst, ob der Stapel leer ist, indem sie die Größe des zugrunde liegenden Slice auswertet. Eine Fehlermeldung wird gesendet, wenn der Stapel leer zu sein scheint, was zu einer Panik führt. Andernfalls ruft es das letzte Element aus dem Slice ab, entfernt es vom Stapel, indem es das Slice bis zum vorletzten Element aufteilt, und gibt das entfernte Element zurück.

Als Nächstes wird der neue Stapel von Ganzzahlen mithilfe der Stack[int]-Syntax innerhalb der Hauptfunktion dieses Codes erstellt. Danach wird die „Push“-Methode dreimal aufgerufen, um die Ganzzahlen 1, 2 und 3 zum Stapel hinzuzufügen. Allerdings wird die Methode „Pop“ anschließend dreimal aufgerufen, um die Elemente vom Stapel abzurufen und zu drucken.

Die folgende Ausgabe gibt an, dass die Elemente in umgekehrter Reihenfolge vom Stapel entfernt werden:

Beispiel 4: Verwendung der generischen Golang-Einschränkungen

Go bietet auch benutzerdefinierte Einschränkungen, die eine große Flexibilität ermöglichen und spezifische Anforderungen für generische Konstrukte basierend auf ihren Anwendungsanforderungen definieren. Der Code der benutzerdefinierten generischen Einschränkungen wird im Folgenden zur Demonstration bereitgestellt:

Paket hauptsächlich
importieren „fmt“
Typ Numerik Schnittstelle {
int64 | float64
}
Funktion hauptsächlich () {
FloatValue := [] float64 { 2 . 0 , 4 . 0 , 6 . 0 , 8 . 0 , 10 . 0 }
Integer Wert := [] int64 { 2 , 4 , 6 , 8 , 10 }
Summe1 := generische Summe ( FloatValue )
Summe2 := generische Summe ( Integer Wert
fmt . Druckenln ( „Summe von float64:“ , Summe1 )
fmt . Druckenln ( „Summe von int64:“ , Summe2 )

}
Funktion generische Summe [ n Numerik ]( Zahlen [] N ) N {
War ich bin n
für _ , Auf eins := Bereich Zahlen {
Summe += Auf eins
}
zurückkehren Summe
}

Im vorherigen Quellcode definieren wir die Numerics-Schnittstelle mit der Methode „Sum“. Anschließend erstellen wir zwei benutzerdefinierte Typen, „FloatValue“ und „IntegerValue“, die die Numerics-Schnittstelle implementieren, indem sie ihre jeweiligen „Sum“-Methoden bereitstellen. Die genericSum-Funktion kann jetzt Slices jedes Typs akzeptieren, der die Numerics-Schnittstelle erfüllt. Innerhalb der Funktion iterieren wir über die Elemente und rufen die Methode „Sum“ auf, um die Summe zu berechnen. Schließlich erstellen wir in der Hauptfunktion die Slices von FloatValue und IntegerValue und übergeben sie an die Funktion genericSum(), die die Summe der Elemente in jedem Slice korrekt berechnet.

Die erwartete Ausgabe ist nun auf dem folgenden Bildschirm sichtbar:

Abschluss

Wir haben einige praktische Beispiele für Go-Generika untersucht, darunter die Erstellung einer generischen Datenstruktur und einer generischen Funktion, die Definition einer generischen Schnittstelle und die Verwendung der benutzerdefinierten Typbeschränkung. Diese Beispiele zeigen die Leistungsfähigkeit und Flexibilität, die Generika der Programmiersprache Go verleihen. Beachten Sie, dass die generische Codegenerierung während der Kompilierung eine effiziente Binärgröße und Kompilierungszeiten gewährleistet.