bakgrunnseffekt

Generics i Go

Ricco Førgaard

Seniorkonsulent

portrait image decoration

Publisert Torsdag 25. februar 2021
Sist oppdatert Fredag 8. oktober 2021

Nylig ble det annonsert at Go (endelig) skal få generics. Featuren har kanskje vært den mest etterspurte og omdiskuterte endringen til språket og nå er det altså vedtatt at det kommer. Generics er ikke tilgjengelig enda og det vil sikkert vare mange måneder før det kommer, men det skal ikke forhindre oss i å ta en sniktitt på hva generics i Go egentlig er for en størrelse.

Hva skal vi med generics?

Generics er kjent fra mange andre språk som for eksempel Java og C# og betyr i korte trekk at man kan definere typer som først blir kjent når koden kjøres og ikke når den kompileres, som det ellers er vanlig. Dette gjør det mulig å skrive mer _/generisk/ kode som åpner opp for mer gjenbruk og dermed mindre duplisering av koden man skriver.

Bruken av generics

Med generics kan funksjoner defineres med en ekstra parameter, kalt for en typeparameter. Den definerer en type som brukes lokalt i funksjonen. For eksempel:

Go
    
  

(eksemplet er tatt fra go2go Playground hvor du kan leke med generics i Go)

Koden i eksemplet over kan jobbe på en slice med vilkårlige typer. Uten generics må man enten definere et interface som alle objektene i slicen implementerer eller skrive den samme funksjonen for alle typer man trenger å bruke funksjonen med.

Det neste eksemplet belyser fordelen med generics enda bedre:

Go
    
  

(eksemplet er tatt fra bloggposten Why generics?)

Funksjonen over reverserer en slice av objekter. Den gjør ikke noe med elementene som sådan annet enn å flytte rundt på de i listen. Dette er en veldig vanlig ting å gjøre, men igjen kommer typene litt i veien hvis man ikke kan bruke generics. Med generics vil funksjonen virke for alle typer siden alle typer passer til definisjonen.

Generics eller ikke

De foregående eksemplene beskriver ganske godt hvorfor generics har en plass i et språk som Go. Generics løser en klasse av problemer som ellers er vanskelige (men ikke umulige) å løse. Interfaces har fortsatt sin plass i språket; de beskriver objekters egenskaper eller "oppførsel" og det er veldig nyttig på sin egen måte. Generics gjør det enklere å skrive kode vi kan bruke i mange forskjellige sammenhenger uten å gjenta den igjen og igjen.

Samtidig så er en av styrkene til Go også at det ikke er så mye "magi" som man finner i visse andre språk. Funksjonalitet er ikke gjemt vekk i adskillige lag av abstraksjon som man må brette ut i hodet når man i etterkant prøver å forstå hva koden gjør. Siden funksjoner som eksemplene over nettopp er så vanskelig å generalisere blir det enklere å bare definere de på nytt der de skal brukes og med de typene de skal brukes med. Det bidrar til kode som er enklere å lese.