Googles Go-sprog får typeparametre

Illustration: Bigstock/Irena_Geo
Efter flere års udvikling er et forslag om typeparametre vedtaget. Faciliteten debuterer i Go 1.18, der skal udkomme i starten af næste år.

Sproget Go følger nu efter de fleste andre moderne programmeringssprog og får typeparametre, også kaldet ‘generics.’

Det skriver to af sprogets udviklere, Ian Lance Taylor og Robert Griesemer, der begge er ansat i Google. Sproget blev i sin tid udviklet for at løse de udfordringer, der er med server-programmering i stor skala hos Google.

Udviklerne meddeler, at faciliteten forventes at blive tilføjet i version 1.18, som skulle udkomme i starten af 2022.

Typeparametre gør det muligt at skrive kode, hvor funktioner benytter samme operationer for parametre og variable af forskellige typer, og kan på denne måde generalisere en algoritme.

Det benyttes ofte i forbindelse med samlinger, hvor eksempelvis en liste-struktur kan udrustes med en elementtype, så metoder som tilføj(e) kun kan udføres med elementer af den specificerede type som parameter.

Forslaget har været en del år undervejs og et tidligere udkast, som byggede på kontrakter, er forkastet til fordel for en anden model.

Et trivielt eksempel kan se sådan ud, ifølge det vedtagede forslag:

// Print prints the elements of a slice.
// It should be possible to call this with any slice value.
func Print(s []T) { // Just an example, not the suggested syntax.
    for _, v := range s {
        fmt.Println(v)
    }
}

I eksemplet her er []T et slice med elementtypen T.

Typeparametre er magen til almindelige funktionsparametre, og de anføres sammen med andre parametre.

Typeparametrene kan udstyres med ‘constraints’, som begrænser udvalget af typer, der kan anvendes som parametre. En constraint er blot et almindeligt interface, som Stringer herunder:

// Stringify calls the String method on each element of s,
// and returns the results.
func Stringify[T Stringer](s []T) (ret []string) {
    for _, v := range s {
        ret = append(ret, v.String())
    }
    return ret
}

Ingen ko- eller kontravarians

Sprogudviklerne har fravalgt muligheden for at angive kovarians og kontravarians for funktionsparametre, en facilitet der findes i sprog som Java og C#, og som gør det muligt at specificere, hvornår en subtype eller en supertype også accepteres som parameter givet ved et typeudtryk. Udeladelsen gør generics simplere, skrives der i forslaget.

I modsætning til Java benyttes der ikke ‘type erasure’, og det betyder, at en typeparameter i Go er kendt og kan anvendes i koden under afviklingen.

Sammenlignet med C++ nævner sprogudviklerne, at dette sprogs template-implementering af typeparametre ikke benytter constraints, hvilket kan føre til fejlmeddelelser, som kan være svære at forstå for programmøren.

I sammenligning med Rust nævnes det, at Gos nye implementering er magen til Rust, dog med visse forskelle, såsom at en trait i Rust, der benyttes som constraint, skal knyttes specifikt til en type.

Der er mere information om Gos typeparametre i udkastet. Af kodeeksemplerne heri fremgår det, at den endelige syntaks endnu ikke er fastlagt.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (0)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Log ind eller Opret konto for at kommentere