Golang Generics Primjeri

Golang Generics Primjeri



Golangova generička značajka omogućuje stvaranje koda za višekratnu upotrebu koji je siguran za tip i kompatibilan sa širokim rasponom tipova. Srećom, dodavanje generika u Go otvara nove mogućnosti za ponovnu upotrebu koda i fleksibilnost. Najnovija verzija Golanga sa sobom donosi dugo očekivanu podršku za generike.

Što je još važnije, generički proizvodi održavaju Go-ovu snažnu sigurnost tipa koja omogućuje statičku provjeru tipa u vrijeme prevođenja i osigurava ispravnost tipa. Oni pružaju standardizirano rukovanje pogreškama unutar generičkog koda što poboljšava jasnoću i mogućnost održavanja. Osim toga, pružaju standardizirano rukovanje pogreškama unutar generičkog koda što poboljšava jasnoću i mogućnost održavanja. U ovom ćemo postu ispitati nekoliko Go generičkih aplikacija i primjera iz stvarnog svijeta.

Primjer 1: Korištenje generičke funkcije Golang

Jedan od primarnih slučajeva upotrebe generika je stvaranje funkcija koje mogu raditi na različitim tipovima. Ovdje idemo s jednim od primjera gdje se koristi generička funkcija opsega.







paket glavni
uvoz 'fmt'
funk opseg [ r int | plovak32 ]( radijus r ) {
c := 3 * 2 * radius
fmt . Println ( 'Opći opseg je: ' , c )
}
funk glavni () {
bio je r1 int = 7
bio je r2 plovak32 = 7 . 5
opseg ( r1 )
opseg ( r2 )
}

Na početku prethodnog koda, redak uvozi 'fmt' paket koji pruža funkcije za formatirani I/O, uključujući ispis izlaza na konzolu. Zatim definiramo generičku funkciju pod nazivom 'circumference' koja uzima parametar radijus generičkog tipa 'r' koji može biti ili 'int' ili 'float32'. Unutar funkcije izračunava opseg množenjem polumjera s konstantnom vrijednošću '3' i zatim množenjem s '2'. Na kraju, ispisuje izračunati opseg pomoću 'fmt.Println'.



Zatim imamo glavnu funkciju gdje su dvije varijable, r1 i r2, deklarirane i dodijeljene im vrijednosti 7 odnosno 7,5. Nakon toga, funkcija 'opseg' se poziva dva puta, prosljeđujući r1 i r2 kao argumente.



Izlaz prikazuje izračun ispisivanjem opsega krugova na sljedeći način:





Primjer 2:  Korištenje Golang generičkog sučelja

Štoviše, Golang generici nam pomažu sa svojim sučeljima. Sučelja u Gou ključni su alat za olakšavanje ponovne upotrebe koda i polimorfizma. Omogućujući im da funkcioniraju s mnogim tipovima, generici povećavaju snagu sučelja. Slijedi izvorni kod Golang generičkog sučelja:



paket glavni
uvoz 'fmt'
tip EmpAge sučelje {
int64 | int32 | plovak32 | plovak64
}
funk newGenericFunc [ dob Dob ]( emp_Dob dob ) {
val := int ( emp_Dob ) + 1
fmt . Println ( val )
}
funk glavni () {
fmt . Println ( 'Starost zaposlenika' )
bio je Dob1 int64 = 24
bio je Dob2 plovak64 = 25 . 5
newGenericFunc ( Dob1 )
newGenericFunc ( Dob2 )
}

U prethodnom izvornom kodu definirali smo sučelje pod nazivom 'EmpAge' koje navodi moguće vrste za dob zaposlenika. Sučelje uključuje tipove int64, int32, float32 i float64. Ovo sučelje omogućuje 'generičkoj' funkciji da prihvati bilo koju od ovih vrsta kao argument. Nakon toga koristimo generičku funkciju pod nazivom newGenericFunc koja uzima parametar emp_Age generičke vrste dobi koja može biti bilo koja vrsta koja zadovoljava sučelje EmpAge. Unutar funkcije pretvara emp_Age u int i povećava ga za 1 kao što je prikazano.

Zatim deklariramo dvije varijable, Age1 i Age2, i dodjeljujemo vrijednosti 24 odnosno 25,5 u glavnoj funkciji. Nakon toga, Age1 i Age2 prosljeđuju se kao parametri funkciji newGenericFunc koja se dva puta izvršava. Time se dobi povećavaju za 1 i generiraju ažurirane vrijednosti.

Izlaz koji se daje u nastavku su dobi iz generičke funkcije koja koristi sučelje:

Primjer 3: Korištenje generičke strukture podataka Golang

Nadalje, Go generici također nam daju mogućnost izgradnje generičkih struktura podataka kao što su hrpe, redovi čekanja i povezani popisi. Razmotrite implementaciju generičkog stoga u sljedećem:

uvoz 'fmt'
tip Stog [ T bilo koji ] [] T
funk ( sv * Stog [ T ]) Gurnuti ( stavka T ) {
sv = dodati ( * sv , artikal )
}
funk ( sv * Stog [ T ]) Pop () T {
ako samo ( * sv ) == 0 {
panika ( 'Ništa u hrpi' )
}
indeks := samo ( * sv ) - 1
artikal := ( * sv )[ indeks ]
* sv = ( * sv )[: indeks ]
povratak artikal
}
funk glavni () {
stog := novi ( Stog [ int ])
stog . Gurnuti ( 1 )
stog . Gurnuti ( 2 )
stog . Gurnuti ( 3 )
fmt . Println ( stog . Pop ())
fmt . Println ( stog . Pop ())
fmt . Println ( stog . Pop ())
}

U prethodnom kodu definiran je generički tip pod nazivom “Stog” koji predstavlja snop. Čuvar mjesta 'T' dopušta stogu da sadrži elemente bilo koje vrste. Tip “Stop” implementiran je kao isječak elemenata tipa “T”. Ovdje su dvije funkcije raspoređene za vrstu 'Stack': 'Push' i 'Pop'. Funkcija Push() odgovorna je za dodavanje elemenata u stog. Uzima stavku argumenta tipa 'T' i dodaje je temeljnom odsječku pomoću funkcije append().

Dok funkcija Pop() uzima početnu komponentu iz stoga i vraća je, ona prvo utvrđuje je li stog prazan procjenom veličine temeljnog odsječka. Obavijest o pogrešci šalje se ako se čini da je stog prazan što uzrokuje paniku. U suprotnom, dohvaća posljednji element iz odsječka, uklanja ga iz niza rezanjem odsječka do predposljednjeg elementa i vraća uklonjenu stavku.

Zatim se kreira novi stog cijelih brojeva pomoću sintakse Stack[int] unutar glavne funkcije ovog koda. Nakon toga se tri puta poziva metoda 'Push' za dodavanje cijelih brojeva 1, 2 i 3 u stog. Međutim, metoda 'Pop' poziva se tri puta uzastopno kako bi se dohvatili i ispisali elementi iz hrpe.

Sljedeći izlaz pokazuje da su elementi uklonjeni iz hrpe obrnutim redoslijedom:

Primjer 4: Korištenje Golang generičkih ograničenja

Go također nudi prilagođena ograničenja koja omogućuju veliku fleksibilnost i definiraju specifične zahtjeve za generičke konstrukcije na temelju njihovih aplikacijskih potreba. Kod prilagođenih generičkih ograničenja dan je u nastavku za demonstraciju:

paket glavni
uvoz 'fmt'
tip Numerics sučelje {
int64 | plovak64
}
funk glavni () {
FloatValue := [] plovak64 { 2 . 0 , 4 . 0 , 6 . 0 , 8 . 0 , 10 . 0 }
IntegerValue := [] int64 { 2 , 4 , 6 , 8 , 10 }
    sum1 := genericSum ( FloatValue )
zbroj2 := genericSum ( IntegerValue
fmt . Println ( 'Zbroj float64 :' , sum1 )
fmt . Println ( 'Zbroj int64 :' , zbroj2 )

}
funk genericSum [ n Brojčanici ]( brojevima [] n ) n {
bio je Ja sam 'n
za _ , na jedan := domet brojevima {
iznos += na jedan
}
povratak iznos
}

U prethodnom izvornom kodu definirali smo Numerics sučelje metodom 'Sum'. Zatim stvaramo dva prilagođena tipa, 'FloatValue' i 'IntegerValue', koji implementiraju Numerics sučelje pružajući svoje metode 'Sum'. Funkcija genericSum sada može prihvatiti odsječke bilo koje vrste koji zadovoljavaju sučelje Numerics. Unutar funkcije ponavljamo elemente i pozivamo metodu 'Zbroj' za izračunavanje zbroja. Konačno, u glavnoj funkciji stvaramo odsječke FloatValue i IntegerValue i prosljeđujemo ih funkciji genericSum() koja ispravno izračunava zbroj elemenata u svakom odsječku.

Očekivani rezultat sada je vidljiv na sljedećem ekranu:

Zaključak

Istražili smo neke praktične primjere Go generika koji uključuju stvaranje generičke podatkovne strukture i generičke funkcije, definiranje generičkog sučelja i korištenje prilagođenog ograničenja tipa. Ovi primjeri pokazuju snagu i fleksibilnost koju generici donose u programski jezik Go. Imajte na umu da generiranje generičkog koda tijekom kompilacije osigurava učinkovitu binarnu veličinu i vrijeme kompilacije.