Golang generikus példák

Golang Generikus Peldak



A Golang általános funkciója lehetővé teszi olyan újrafelhasználható kód létrehozását, amely típusbiztos és kompatibilis a típusok széles skálájával. Szerencsére az általános gyógyszerek Go-hoz való hozzáadása új utakat nyit a kód újrafelhasználása és a rugalmasság terén. A Golang legújabb verziója magával hozza a generikus gyógyszerek régóta várt támogatását.

Ennél is fontosabb, hogy a generics fenntartja a Go erős típusbiztonságát, amely lehetővé teszi a statikus típusellenőrzést fordítás közben, és biztosítja a típus helyességét. Szabványos hibakezelést biztosítanak az általános kódon belül, ami javítja az átláthatóságot és a karbantarthatóságot. Ezenkívül szabványos hibakezelést biztosítanak az általános kódon belül, amely javítja az átláthatóságot és a karbantarthatóságot. Ebben a bejegyzésben megvizsgáljuk a valós Go generikus alkalmazásokat és példákat.

1. példa: A Golang általános függvény használata

A generikumok egyik elsődleges használati esete olyan függvények létrehozása, amelyek különböző típusokon működhetnek. Itt megyünk az egyik példával, ahol az általános kerületi függvényt használjuk.







csomag fő-
import 'fmt'
func körméret [ r int | úszó32 ]( sugár r ) {
c := 3 * 2 * sugár
fmt . Println ( 'Az általános kerület a következő: , c )
}
func fő- () {
volt r1 int = 7
volt r2 úszó32 = 7 . 5
körméret ( r1 )
körméret ( r2 )
}

Az előző kód elején a sor importálja az „fmt” csomagot, amely funkciókat biztosít a formázott I/O-hoz, beleértve a kimenet kinyomtatását a konzolra. Ezután definiálunk egy „circumference” nevű általános függvényt, amely egy általános „r” típusú paraméter sugarat vesz fel, amely lehet „int” vagy „float32”. A függvényen belül úgy számítja ki a kerületet, hogy a sugarat megszorozza a „3” állandó értékével, majd megszorozza „2”-vel. Végül kinyomtatja a számított kerületet az „fmt.Println” használatával.



Ezután van a fő függvényünk, ahol két változót, az r1-et és az r2-t deklarálunk, és hozzárendeljük 7-es, illetve 7,5-ös értékkel. Ezt követően a „körméret” függvény kétszer meghívásra kerül, argumentumként átadva az r1-et és az r2-t.



A kimenet megjeleníti a számítást a körök kerületének kinyomtatásával az alábbiak szerint:





2. példa:  A Golang általános interfész használata

Ezen túlmenően a Golang generikusok segítenek nekünk interfészeikben. A Go interfészek létfontosságú eszközei a kód újrafelhasználásának és a polimorfizmusnak. Azáltal, hogy sok típussal működhetnek, az általánosságok növelik az interfészek erejét. A következő a Golang generics felület forráskódja:



csomag fő-
import 'fmt'
típus EmpAge felület {
int64 | int32 | úszó32 | úszó64
}
func newGenericFunc [ kor Életkor ]( emp_Age age ) {
val := int ( emp_Age ) + 1
fmt . Println ( val )
}
func fő- () {
fmt . Println ( 'A munkavállalók kora' )
volt Életkor 1 int64 = 24
volt Életkor2 úszó64 = 25 . 5
newGenericFunc ( Életkor 1 )
newGenericFunc ( Életkor2 )
}

Az előző forráskódban definiáltunk egy „EmpAge” nevű felületet, amely megadja a lehetséges típusokat a munkavállaló életkorának megfelelően. Az interfész az int64, int32, float32 és float64 típusokat tartalmazza. Ez az interfész lehetővé teszi az „általános” függvény számára, hogy argumentumként elfogadja ezen típusok bármelyikét. Ezt követően a newGenericFunc nevű általános függvényt alkalmazzuk, amely egy általános kortípus emp_Age paraméterét veszi fel, amely bármilyen típusú lehet, amely megfelel az EmpAge felületnek. A függvényen belül az emp_Age értéket int-re alakítja, és 1-gyel növeli, ahogy az ábra mutatja.

Ezután deklaráljuk a két változót, az Életkor1-et és az Életkor2-t, és hozzárendeljük a 24 és 25,5 értékeket a főfüggvényben. Ezt követően az Age1 és Age2 paraméterként kerül átadásra a newGenericFunc függvénynek, amely kétszer hajtódik végre. Ezzel az életkorok 1-gyel megemelkednek, és a frissített értékeket generálják.

Az alábbiakban kapott kimenet az interfészt használó általános függvény korai:

3. példa: A Golang általános adatstruktúra használata

Ezenkívül a Go generics lehetővé teszi az általános adatstruktúrák, például veremek, várólisták és csatolt listák létrehozását is. Fontolja meg az általános verem megvalósítását a következőkben:

import 'fmt'
típus Kazal [ T bármely ] [] T
func ( utca * Kazal [ T ]) Nyom ( T tétel ) {
utca = mellékel ( * utca , tétel )
}
func ( utca * Kazal [ T ]) Pop () T {
ha csak ( * utca ) == 0 {
pánik ( 'Semmi a veremben' )
}
index := csak ( * utca ) - 1
tétel := ( * utca )[ index ]
* utca = ( * utca )[: index ]
Visszatérés tétel
}
func fő- () {
Kazal := új ( Kazal [ int ])
Kazal . Nyom ( 1 )
Kazal . Nyom ( 2 )
Kazal . Nyom ( 3 )
fmt . Println ( Kazal . Pop ())
fmt . Println ( Kazal . Pop ())
fmt . Println ( Kazal . Pop ())
}

Az előző kódban egy „Stack” nevű általános típust határoztunk meg, amely a veremot képviseli. A „T” helyőrző lehetővé teszi, hogy a verem bármilyen típusú elemet tároljon. A „Stack” típus „T” típusú elemek szeleteként valósul meg. Itt két funkció van telepítve a „Stack” típushoz: „Push” és „Pop”. A Push() függvény feladata, hogy az elemeket hozzáadja a veremhez. Egy „T” típusú argumentumelemet vesz fel, és az append() függvény segítségével hozzáfűzi az alapul szolgáló szelethez.

Míg a Pop() függvény kiveszi a kezdeti komponenst a veremből, és visszaadja, először az alapul szolgáló szelet méretének kiértékelésével határozza meg, hogy a verem üres-e. A rendszer hibaértesítést küld, ha a verem üresnek tűnik, ami pánikot okoz. Ellenkező esetben lekéri a szelet utolsó elemét, eltávolítja azt a veremből úgy, hogy felvágja a szeletet az utolsó előtti elemig, és visszaadja az eltávolított elemet.

Ezután az új egész számok veremét a Stack[int] szintaxis használatával hozzák létre a kód fő funkciójában. Ezt követően a „Push” metódust háromszor hívják meg, hogy az 1, 2 és 3 egész számokat hozzáadják a veremhez. A „Pop” metódust azonban háromszor hívják meg egymás után, hogy lekérjék és kinyomtassák az elemeket a veremből.

A következő kimenet azt jelzi, hogy az elemek fordított sorrendben kerültek eltávolításra a veremből:

4. példa: A Golang általános megszorítások használata

A Go egyéni megszorításokat is kínál, amelyek nagy rugalmasságot tesznek lehetővé, és speciális követelményeket határoznak meg az általános konstrukciók számára az alkalmazási igények alapján. Az egyéni általános megszorítások kódja az alábbiakban látható a demonstráció céljából:

csomag fő-
import 'fmt'
típus Numerics felület {
int64 | úszó64
}
func fő- () {
FloatValue := [] úszó64 { 2 . 0 , 4 . 0 , 6 . 0 , 8 . 0 , 10 . 0 }
IntegerValue := [] int64 { 2 , 4 , 6 , 8 , 10 }
összeg1 := genericSum ( FloatValue )
összeg2 := genericSum ( IntegerValue
fmt . Println ( 'Sum of float64 :' , összeg1 )
fmt . Println ( 'Sum of int64 :' , összeg2 )

}
func genericSum [ n Numerics ]( számok [] n ) n {
volt n vagyok
számára _ , az egyiken := hatótávolság számok {
összeg += az egyiken
}
Visszatérés összeg
}

A korábbi forráskódban a Numerics interfészt a „Sum” metódussal határoztuk meg. Ezután két egyéni típust hozunk létre, a „FloatValue”-t és az „IntegerValue”-t, amelyek megvalósítják a Numerics felületet a megfelelő „Sum” metódusok megadásával. A genericSum függvény mostantól bármilyen típusú szeletet képes elfogadni, amely megfelel a Numerics felületnek. A függvényen belül iteráljuk az elemeket, és meghívjuk a „Sum” metódust az összeg kiszámításához. Végül a fő függvényben létrehozzuk a FloatValue és IntegerValue szeleteket, és átadjuk őket a genericSum() függvénynek, amely helyesen számítja ki az egyes szeletek elemeinek összegét.

A várt kimenet most a következő képernyőn látható:

Következtetés

Megvizsgáltunk néhány gyakorlati példát a Go genericsokra, amelyek magukban foglalják egy általános adatstruktúra és általános függvény létrehozását, egy általános interfész definiálását és az egyéni típuskényszer használatát. Ezek a példák azt az erőt és rugalmasságot mutatják be, amelyet a generikus termékek a Go programozási nyelvben nyújtanak. Vegye figyelembe, hogy az általános kód generálása a fordítás során biztosítja a hatékony bináris méretet és a fordítási időket.