Esempi di generici Golang

Esempi Di Generici Golang



La funzionalità dei generici di Golang consente di creare un codice riutilizzabile che sia indipendente dai tipi e compatibile con un'ampia gamma di tipi. Fortunatamente, l'aggiunta di generici a Go apre nuove strade per il riutilizzo e la flessibilità del codice. L'ultima versione di Golang porta con sé il tanto atteso supporto per i generici.

Ancora più importante, generics mantiene la forte sicurezza dei tipi di Go che consente il controllo del tipo statico in fase di compilazione e garantisce la correttezza del tipo. Forniscono una gestione degli errori standardizzata all'interno del codice generico che migliora la chiarezza e la manutenibilità. Inoltre, forniscono una gestione degli errori standardizzata all'interno del codice generico che migliora la chiarezza e la manutenibilità. In questo post, esamineremo le diverse applicazioni ed esempi di generici Go nel mondo reale.

Esempio 1: utilizzo della funzione generica Golang

Uno dei casi d'uso principali per i generici è la creazione di funzioni che possono operare su tipi distinti. Qui, andiamo con uno degli esempi in cui viene utilizzata la funzione di circonferenza generica.







pacchetto principale
importare 'fmt'
funz circonferenza [ R int | galleggiante32 ]( raggio r ) {
C := 3 * 2 * raggio
fmt . Stampaln ( 'La circonferenza generica è: ' , C )
}
funz principale () {
era r1 int = 7
era r2 galleggiante32 = 7 . 5
circonferenza ( r1 )
circonferenza ( r2 )
}

All'inizio del codice precedente, la riga importa il pacchetto 'fmt' che fornisce funzioni per l'I/O formattato, inclusa la stampa dell'output sulla console. Quindi, definiamo una funzione generica denominata 'circonferenza' che accetta un parametro raggio di un tipo generico 'r' che può essere un 'int' o un 'float32'. All'interno della funzione calcola la circonferenza moltiplicando il raggio per il valore costante di “3” e poi moltiplicandolo per “2”. Infine, stampa la circonferenza calcolata utilizzando “fmt.Println”.



Successivamente, abbiamo la funzione principale in cui due variabili, r1 e r2, sono dichiarate e assegnate rispettivamente ai valori 7 e 7.5. Successivamente, la funzione 'circonferenza' viene invocata due volte, passando r1 e r2 come argomenti.



L'output visualizza il calcolo stampando le circonferenze dei cerchi come segue:





Esempio 2:  utilizzo dell'interfaccia generica Golang

Inoltre, i generici Golang ci aiutano con le loro interfacce. Le interfacce in Go sono uno strumento vitale per facilitare il riutilizzo del codice e il polimorfismo. Consentendo loro di funzionare con molti tipi, i generici aumentano la potenza delle interfacce. Di seguito è riportato il codice sorgente dell'interfaccia dei generici di Golang:



pacchetto principale
importare 'fmt'
tipo EmpAge interfaccia {
int64 | int32 | galleggiante32 | galleggiante64
}
funz newGenericFunc [ età Età ]( emp_Age età ) {
val := int ( emp_Age ) + 1
fmt . Stampaln ( val )
}
funz principale () {
fmt . Stampaln ( 'Età dei dipendenti' )
era Età1 int64 = 24
era Età2 galleggiante64 = 25 . 5
newGenericFunc ( Età1 )
newGenericFunc ( Età2 )
}

Nel codice sorgente precedente, abbiamo definito un'interfaccia denominata 'EmpAge' che specifica i tipi possibili per l'età di un dipendente. L'interfaccia include i tipi int64, int32, float32 e float64. Questa interfaccia consente alla funzione 'generica' ​​di accettare uno qualsiasi di questi tipi come argomento. Successivamente, utilizziamo una funzione generica denominata newGenericFunc che accetta il parametro emp_Age di un tipo generico di età che può essere qualsiasi tipo che soddisfi l'interfaccia EmpAge. All'interno della funzione, converte emp_Age in un int e lo incrementa di 1 come mostrato.

Successivamente, dichiariamo le due variabili, Età1 ed Età2, e assegniamo i valori rispettivamente di 24 e 25,5 nella funzione principale. Successivamente, Age1 e Age2 vengono passati come parametri alla funzione newGenericFunc che viene eseguita due volte. Con questo, le età vengono aumentate di 1 e generano i valori aggiornati.

L'output che viene prodotto di seguito sono le età dalla funzione generica che utilizza l'interfaccia:

Esempio 3: utilizzo della struttura dati generica Golang

Inoltre, Go generics ci dà anche la possibilità di creare strutture di dati generiche come pile, code ed elenchi collegati. Considera l'implementazione dello stack generico nel seguente:

importare 'fmt'
tipo Pila [ T qualsiasi ] [] T
funz ( st * Pila [ T ]) Spingere ( articolo t ) {
st = aggiungere ( * st , articolo )
}
funz ( st * Pila [ T ]) Pop () T {
Se soltanto ( * st ) == 0 {
panico ( 'Niente in pila' )
}
indice := soltanto ( * st ) - 1
articolo := ( * st )[ indice ]
* st = ( * st )[: indice ]
ritorno articolo
}
funz principale () {
pila := nuovo ( Pila [ int ])
pila . Spingere ( 1 )
pila . Spingere ( 2 )
pila . Spingere ( 3 )
fmt . Stampaln ( pila . Pop ())
fmt . Stampaln ( pila . Pop ())
fmt . Stampaln ( pila . Pop ())
}

Nel codice precedente è definito un tipo generico denominato “Stack” che rappresenta lo stack. Il segnaposto “T” permette alla pila di contenere elementi di qualsiasi tipo. Il tipo 'Stack' è implementato come una fetta di elementi di tipo 'T'. Qui vengono implementate due funzioni per il tipo 'Stack': 'Push' e 'Pop'. La funzione Push() è responsabile dell'aggiunta degli elementi allo stack. Prende un argomento di tipo 'T' e lo aggiunge alla slice sottostante utilizzando la funzione append().

Sebbene la funzione Pop() prenda il componente iniziale dallo stack e lo restituisca, determina innanzitutto se lo stack è vuoto valutando la dimensione della slice sottostante. Se lo stack sembra vuoto, viene inviata una notifica di errore che causa un panico. In caso contrario, recupera l'ultimo elemento dalla sezione, lo rimuove dallo stack suddividendo la sezione fino al penultimo elemento e restituisce l'elemento rimosso.

Successivamente, il nuovo stack di numeri interi viene creato utilizzando la sintassi Stack[int] all'interno della funzione principale di questo codice. Successivamente, il metodo 'Push' viene chiamato tre volte per aggiungere gli interi 1, 2 e 3 allo stack. Tuttavia, il metodo 'Pop' viene chiamato tre volte successivamente per recuperare e stampare gli elementi dallo stack.

Il seguente output indica che gli elementi vengono rimossi dallo stack in ordine inverso:

Esempio 4: utilizzo dei vincoli generici Golang

Go offre anche vincoli personalizzati che consentono una grande flessibilità e definiscono requisiti specifici per costrutti generici in base alle loro esigenze applicative. Il codice dei vincoli generici personalizzati è fornito di seguito per dimostrazione:

pacchetto principale
importare 'fmt'
tipo Numerici interfaccia {
int64 | galleggiante64
}
funz principale () {
FloatValue := [] galleggiante64 { 2 . 0 , 4 . 0 , 6 . 0 , 8 . 0 , 10 . 0 }
Valore intero := [] int64 { 2 , 4 , 6 , 8 , 10 }
somma1 := genericoSum ( FloatValue )
somma2 := genericoSum ( Valore intero
fmt . Stampaln ( 'Somma di float64 :' , somma1 )
fmt . Stampaln ( 'Somma di int64 :' , somma2 )

}
funz genericoSum [ n Numerici ]( numeri [] N ) N {
era sono n
per _ , nessuno := allineare numeri {
somma += nessuno
}
ritorno somma
}

Nel codice sorgente precedente, definiamo l'interfaccia Numerics con il metodo 'Sum'. Quindi, creiamo due tipi personalizzati, 'FloatValue' e 'IntegerValue', che implementano l'interfaccia Numerics fornendo i rispettivi metodi 'Sum'. La funzione genericSum è ora in grado di accettare le fette di qualsiasi tipo che soddisfi l'interfaccia Numerics. All'interno della funzione, iteriamo sugli elementi e chiamiamo il metodo 'Sum' per calcolare la somma. Infine, nella funzione main, creiamo le slice di FloatValue e IntegerValue e le passiamo alla funzione genericSum() che calcola correttamente la somma degli elementi in ogni slice.

L'output previsto è ora visibile nella schermata seguente:

Conclusione

Abbiamo esplorato alcuni esempi pratici di generici Go che includono la creazione di una struttura dati generica e di una funzione generica, la definizione di un'interfaccia generica e l'utilizzo del vincolo di tipo personalizzato. Questi esempi dimostrano la potenza e la flessibilità che i generici apportano al linguaggio di programmazione Go. Si noti che la generazione del codice generico durante la compilazione garantisce l'efficienza della dimensione binaria e dei tempi di compilazione.