Exemple de generice Golang

Exemple De Generice Golang



Caracteristica generică a lui Golang face posibilă crearea unui cod reutilizabil care este sigur de tip și compatibil cu o gamă largă de tipuri. Din fericire, adăugarea de generice la Go deschide noi căi pentru reutilizarea codului și flexibilitate. Cea mai recentă versiune de Golang aduce cu ea suportul foarte așteptat pentru medicamente generice.

Mai important, genericele mențin siguranța puternică a tipului a lui Go, care permite verificarea statică a tipului în timpul compilării și asigură corectitudinea tipului. Acestea oferă o gestionare standardizată a erorilor în cadrul codului generic, care îmbunătățește claritatea și mentenabilitatea. În plus, oferă o gestionare standardizată a erorilor în cadrul codului generic, care îmbunătățește claritatea și mentenabilitatea. În această postare, vom examina mai multe aplicații și exemple de generice Go din lumea reală.

Exemplul 1: Utilizarea funcției generice Golang

Unul dintre cazurile de utilizare principale pentru generice este crearea de funcții care pot funcționa pe tipuri distincte. Aici, mergem cu unul dintre exemplele în care este utilizată funcția de circumferință generică.







pachet principal
import 'fmt'
func circumferinţă [ r int | plutitor32 ]( raza r ) {
c := 3 * 2 * rază
fmt . Println ( 'Circumferința generică este: ' , c )
}
func principal () {
a fost r1 int = 7
a fost r2 plutitor32 = 7 . 5
circumferinţă ( r1 )
circumferinţă ( r2 )
}

La începutul codului anterior, linia importă pachetul „fmt” care oferă funcții pentru I/O formatate, inclusiv imprimarea ieșirii pe consolă. Apoi, definim o funcție generică numită „circumference” care ia o rază a parametrului de tip generic „r” care poate fi fie un „int” fie un „float32”. În interiorul funcției, calculează circumferința înmulțind raza cu valoarea constantă a lui „3” și apoi înmulțind-o cu „2”. În cele din urmă, imprimă circumferința calculată folosind „fmt.Println”.



În continuare, avem funcția principală în care două variabile, r1 și r2, sunt declarate și atribuite cu valorile de 7 și respectiv 7,5. După aceea, funcția „circumferință” este invocată de două ori, trecând ca argumente r1 și r2.



Ieșirea afișează calculul prin imprimarea circumferințelor cercurilor în următoarele:





Exemplul 2:  Utilizarea interfeței generice Golang

Mai mult, genericele Golang ne ajută cu interfețele lor. Interfețele din Go sunt un instrument vital pentru a facilita reutilizarea codului și polimorfismul. Permițându-le să funcționeze cu mai multe tipuri, genericele măresc puterea interfețelor. Următorul este codul sursă al interfeței generice Golang:



pachet principal
import 'fmt'
tip EmpAge interfata {
int64 | int32 | plutitor32 | float64
}
func newGenericFunc [ varsta Varsta ]( emp_Age varsta ) {
val := int ( emp_Age ) + 1
fmt . Println ( val )
}
func principal () {
fmt . Println ( „Vârsta angajaților” )
a fost Varsta 1 int64 = 24
a fost Varsta 2 float64 = 25 . 5
newGenericFunc ( Varsta 1 )
newGenericFunc ( Varsta 2 )
}

În codul sursă anterior, am definit o interfață numită „EmpAge” care specifică tipurile posibile pentru vârsta unui angajat. Interfața include tipurile int64, int32, float32 și float64. Această interfață permite funcției „generice” să accepte oricare dintre aceste tipuri ca argument. După aceea, folosim o funcție generică numită newGenericFunc care preia parametrul emp_Age al unui tip generic de vârstă care poate fi orice tip care satisface interfața EmpAge. În interiorul funcției, convertește emp_Age într-un int și îl incrementează cu 1, așa cum se arată.

În continuare, declarăm cele două variabile, Age1 și Age2, și atribuim valorile de 24 și, respectiv, 25,5 în funcția principală. Ulterior, Age1 și Age2 sunt transmise ca parametri la funcția newGenericFunc care trece printr-o execuție de două ori. Cu aceasta, vârstele sunt crescute cu 1 și generează valorile actualizate.

Rezultatele care sunt obținute în următoarele sunt vârstele din funcția generică care utilizează interfața:

Exemplul 3: Utilizarea structurii de date generice Golang

Mai mult, genericele Go ne oferă și capacitatea de a construi structuri de date generice, cum ar fi stive, cozi și liste legate. Luați în considerare implementarea stivei generice în următoarele:

import 'fmt'
tip Grămadă [ Oricare ] [] T
func ( Sf * Grămadă [ T ]) Apăsaţi ( articolul T ) {
Sf = adăuga ( * Sf , articol )
}
func ( Sf * Grămadă [ T ]) Pop () T {
dacă numai ( * Sf ) == 0 {
panică ( „Nimic în stivă” )
}
index := numai ( * Sf ) - 1
articol := ( * Sf )[ index ]
* Sf = ( * Sf )[: index ]
întoarcere articol
}
func principal () {
grămadă := nou ( Grămadă [ int ])
grămadă . Apăsaţi ( 1 )
grămadă . Apăsaţi ( 2 )
grămadă . Apăsaţi ( 3 )
fmt . Println ( grămadă . Pop ())
fmt . Println ( grămadă . Pop ())
fmt . Println ( grămadă . Pop ())
}

În codul anterior, este definit un tip generic intitulat „Stack” care reprezintă stiva. Substituentul „T” permite stivei să țină elementele de orice tip. Tipul „Stiva” este implementat ca o felie de elemente de tip „T”. Aici sunt implementate două funcții pentru tipul „Stack”: „Push” și „Pop”. Funcția Push() este responsabilă pentru adăugarea elementelor în stivă. Este nevoie de un element argument de tip „T” și îl adaugă la felia de bază folosind funcția append().

În timp ce funcția Pop() preia componenta inițială din stivă și o returnează, mai întâi determină dacă stiva este goală, evaluând dimensiunea feliei de bază. O notificare de eroare este trimisă dacă stiva pare a fi goală, ceea ce provoacă o panică. În caz contrar, preia ultimul element din felie, îl elimină din stivă prin felierea feliei până la al doilea element și returnează elementul eliminat.

Apoi, noua stivă de numere întregi este creată folosind sintaxa Stack[int] din funcția principală a acestui cod. După aceea, metoda „Push” este apoi apelată de trei ori pentru a adăuga numerele întregi 1, 2 și 3 la stivă. Cu toate acestea, metoda „Pop” este apelată de trei ori ulterior pentru a prelua și imprima elementele din stivă.

Următoarea ieșire indică faptul că elementele sunt eliminate din stivă în ordine inversă:

Exemplul 4: Utilizarea constrângerilor generice Golang

Go oferă, de asemenea, constrângeri personalizate care permit o mare flexibilitate și definesc cerințe specifice pentru construcțiile generice pe baza nevoilor aplicației lor. Codul constrângerilor generice personalizate este furnizat în următoarele pentru demonstrație:

pachet principal
import 'fmt'
tip Numerice interfata {
int64 | float64
}
func principal () {
FloatValue := [] float64 { 2 . 0 , 4 . 0 , 6 . 0 , 8 . 0 , 10 . 0 }
Valoare intreaga := [] int64 { 2 , 4 , 6 , 8 , 10 }
suma1 := genericSum ( FloatValue )
suma2 := genericSum ( Valoare intreaga
fmt . Println ( „Suma de float64 :” , suma1 )
fmt . Println ( „Suma int64 :” , suma2 )

}
func genericSum [ n Numerice ]( numere [] n ) n {
a fost eu sunt n
pentru _ , pe unu := gamă numere {
sumă += pe unu
}
întoarcere sumă
}

În codul sursă anterior, definim interfața Numerics cu metoda „Suma”. Apoi, creăm două tipuri personalizate, „FloatValue” și „IntegerValue”, care implementează interfața Numerics furnizând metodele respective „Sum”. Funcția genericSum este acum capabilă să accepte feliile de orice tip care satisface interfața Numerics. În interiorul funcției, repetăm ​​elementele și apelăm metoda „Suma” pentru a calcula suma. În cele din urmă, în funcția principală, creăm feliile de FloatValue și IntegerValue și le trecem la funcția genericSum() care calculează corect suma elementelor din fiecare felie.

Ieșirea așteptată este acum vizibilă pe următorul ecran:

Concluzie

Am explorat câteva exemple practice de generice Go, care includ crearea unei structuri de date generice și a unei funcții generice, definirea unei interfețe generice și utilizarea constrângerii de tip personalizat. Aceste exemple demonstrează puterea și flexibilitatea pe care genericele le aduc limbajului de programare Go. Rețineți că generarea codului generic în timpul compilării asigură dimensiunea binarului eficient și timpii de compilare.