Què significa el suport dels genèrics de Golang per a l’estructura del codi

Go, també conegut com a Golang, és un llenguatge de programació compilat que es considera de manera forta i estàtica. El llenguatge va afegir suport genèric el març de 2022, una actualització que té el potencial de simplificar la base de codi global d’un projecte.

Però abans de capbussar-se en els genèrics de Golang, els programadors han d’entendre el sistema de tipus de Go i com s’adapta a l’univers global del llenguatge de programació.

Molt escrit vs. llenguatges de programació feblement escrits

Els llenguatges de programació fortament tipificats només permeten operacions en determinats tipus de variables. Per exemple, un llenguatge molt escrit no permetria afegir un nombre enter a una cadena perquè l’idioma considera que els dos tipus de dades són incompatibles.

En canvi, un llenguatge poc escrit, convertiria automàticament una de les variables a l’altre tipus i realitzaria l’addició.

Com a exemple, considereu la següent línia de codi Go.

var s = "1" + 1

Com que els tipus no coincideixen… “1” és una corda i 1 és un nombre enter — l’operació d’addició no es pot realitzar. En canvi, el compilador retorna l’error següent.

invalid operation: "1" + 1 (mismatched types untyped string and untyped int)

Compareu aquesta sortida amb els resultats de la mateixa operació en JavaScript, un llenguatge poc escrit.

console.log("1" + 1)

Això retorna la cadena “11” perquè JavaScript converteix l’enter en una cadena per concatenar els dos valors. JavaScript no té una definició sòlida dels tipus de dades proporcionats i, en canvi, els transmet implícitament.

La qüestió de si una llengua està escrita amb força o dèbilment no sempre és senzilla. No hi ha cap idioma 100% escrit amb força o dèbil, ja que les característiques es poden escriure individualment amb força o dèbil.

En la seva majoria, Go es descriu com a fort escrit pel motiu que s’indica més amunt. No obstant això, hi ha exemples de funcions d’escriptura feble a Go. Concretament, les interfícies de Go s’implementen implícitament, sense cap implements paraula clau. Si un tipus implementa mètodes definits per una interfície, llavors implementa aquesta interfície automàticament.

Tipus estàticament vs. llenguatges de programació de tipus dinàmic

L’escriptura estàtica i dinàmica descriu si un llenguatge de programació verifica el tipus d’una variable en temps de compilació o en temps d’execució. Una idea errònia comuna és que tots els idiomes amb mecanografia forta s’escriuen de manera estàtica i, de la mateixa manera, tots els idiomes amb mecanografia feble s’escriuen dinàmicament.

Els llenguatges escrits de manera estàtica comproven el tipus d’una variable al principi del cicle de vida de la programació, en temps de compilació, mentre que els llenguatges de tipus dinàmic poden actualitzar el tipus en temps d’execució.

Go s’escriu estàticament i, per tant, no pot actualitzar el tipus d’una variable en temps d’execució. Considereu l’exemple següent.

var s = "Hello, World" 
s = 2

En executar aquest codi, el compilador de Go falla i retorna el següent error.

cannot use 2 (untyped int constant) as string value in assignment

Perquè la variable s s’escriu estàticament com una cadena, només es pot actualitzar amb valors de cadena.

El següent és un exemple de reassignació de tipus a Python, un llenguatge escrit dinàmicament on aquestes línies no causen cap problema en l’execució.

i = 4 
i = "four"

Què són els genèrics a la programació?

Des d’una perspectiva de programació general, els genèrics són funcions o estructures de dades que es poden escriure sense definir tipus específics. Amb els genèrics, és possible escriure una funció que accepti un tipus genèric i que es pugui cridar a molts tipus diferents.

Com a exemple, imagineu-vos escrivint una funció per invertir una llista de nombres enters. En un llenguatge sense genèrics, un programador hauria d’escriure una funció independent per a cada tipus de llista. El programa requeriria funcions inverses separades per gestionar una llista de nombres enters, una llista de cadenes i una llista de llistes.

L’objectiu dels genèrics és reduir el codi duplicat que sorgeix quan es realitzen les mateixes funcions en diferents tipus. En lloc de definir funcions inverses separades per a llistes d’enters i llistes de cadenes, els genèrics permeten als programadors definir una funció per a un tipus genèric, que després es pot cridar en una llista formada per valors de qualsevol tipus.

Genèrics de Golang

Durant la major part de la història de Go, l’idioma no admetia genèrics. Els creadors i els enginyers principals de Go inicialment estaven preocupats perquè l’addició de genèrics creés una complexitat innecessària o conduís a programes més lents. Els genèrics, una addició influent a l’idioma, es van introduir el març de 2022.

A continuació es mostra un exemple dels genèrics Go actuals en acció.

func reverse[T any](myList []T) []T {
    length := len(myList)
        reversedList := make([]T, length)
        for index, element := range myList {
            reversedList[length-index-1] = element
        }
        return reversedList
    }
    func main() {
        primes := []int{2, 3, 5, 7, 11, 13}
        names := []string{"Jack", "Frank", "Petra", "Harlod"}

        fmt.Println(reverse(primes))
        fmt.Println(reverse(names))
    }

La signatura de la funció genèrica inclou el cap paraula clau, que ho especifica T — el nostre tipus genèric — pot ser qualsevol tipus. Per especificar que la funció només es pot utilitzar amb determinats tipus, com ara cadenes i nombres enters, escriviu aquests tipus en lloc de cap paraula clau. Per a una funció que ordena una llista, utilitzant el Ordenat paraula clau restringeix la funció als tipus que es poden comparar amb el >, >=, < i <= operadors.

Leave a Comment

Your email address will not be published. Required fields are marked *